Verbessern der Leistung Ihrer Office-Skripts

Der Zweck von Office-Skripts besteht darin, häufig ausgeführte Aufgaben zu automatisieren, um Ihnen Zeit zu sparen. Ein langsames Skript kann den Eindruck haben, dass es Ihren Workflow nicht beschleunigt. In den meisten Fällen ist Ihr Skript vollkommen in Ordnung und wird wie erwartet ausgeführt. Es gibt jedoch einige vermeidbare Szenarien, die sich auf die Leistung auswirken können.

Reduzieren der Anzahl von Lese- oder Schreibaufrufen

Der häufigste Grund für ein langsames Skript ist eine übermäßige Kommunikation mit der Arbeitsmappe. Dies fällt besonders bei der Verwendung von Excel im Web auf. Zu bestimmten Zeiten synchronisiert Ihr Skript seine lokalen Daten mit denen der Arbeitsmappe. Dies bedeutet, dass alle Schreibvorgänge (z workbook.addWorksheet(). B. ) nur auf die Arbeitsmappe angewendet werden, wenn diese Synchronisierung hinter den Kulissen erfolgt. Ebenso erhalten alle Lesevorgänge (z myRange.getValues(). B. ) zu diesen Zeiten nur Daten aus der Arbeitsmappe für das Skript. In beiden Fällen ruft das Skript Informationen ab, bevor es auf die Daten reagiert. Der folgende Code protokolliert beispielsweise genau die Anzahl der Zeilen im verwendeten Bereich.

let usedRange = workbook.getActiveWorksheet().getUsedRange();
let rowCount = usedRange.getRowCount();
// The script will read the range and row count from
// the workbook before logging the information.
console.log(rowCount);

Office-Skript-APIs stellen sicher, dass alle Daten in der Arbeitsmappe oder dem Skript bei Bedarf genau und auf dem neuesten Stand sind. Sie müssen sich keine Gedanken über diese Synchronisierungen machen, damit Ihr Skript ordnungsgemäß ausgeführt wird. Ein Bewusstsein für diese Skript-zu-Cloud-Kommunikation kann Ihnen jedoch helfen, nicht benötigte Netzwerkaufrufe zu vermeiden.

Lesen von Arbeitsmappendaten außerhalb einer Schleife

Jede Methode, die Daten aus der Arbeitsmappe abruft, kann einen Netzwerkaufruf auslösen. Anstatt wiederholt denselben Aufruf auszuführen, sollten Sie Daten nach Möglichkeit lokal speichern. Dies gilt insbesondere für Schleifen.

Betrachten Sie ein Skript, um die Anzahl der negativen Zahlen im verwendeten Bereich eines Arbeitsblatts abzurufen. Das Skript muss jede Zelle im verwendeten Bereich durchlaufen. Dazu werden der Bereich, die Anzahl der Zeilen und die Anzahl der Spalten benötigt. Sie sollten diese als lokale Variablen speichern, bevor Sie die Schleife starten. Andernfalls erzwingt jede Iteration der Schleife eine Rückkehr zur Arbeitsmappe.

/**
 * This script provides the count of negative numbers that are present
 * in the used range of the current worksheet.
 */
function main(workbook: ExcelScript.Workbook) {
  // Get the working range.
  let usedRange = workbook.getActiveWorksheet().getUsedRange();

  // Save the values locally to avoid repeatedly asking the workbook.
  let usedRangeValues = usedRange.getValues();

  // Start the negative number counter.
  let negativeCount = 0;

  // Iterate over the entire range looking for negative numbers.
  for (let i = 0; i < usedRangeValues.length; i++) {
    for (let j = 0; j < usedRangeValues[i].length; j++) {
      if (usedRangeValues[i][j] < 0) {
        negativeCount++;
      }
    }
  }

  // Log the negative number count to the console.
  console.log(negativeCount);
}

Hinweis

Versuchen Sie als Experiment, in der Schleife durch usedRange.getValues()zu usedRangeValues ersetzen. Sie können feststellen, dass die Ausführung des Skripts bei großen Bereichen erheblich länger dauert.

Vermeiden der Verwendung von try...catch Blöcken in oder umgebenden Schleifen

Es wird davon abgeraten, Anweisungen in Schleifen oder umgebenden Schleifen zu verwenden try...catch . Aus demselben Grund sollten Sie das Lesen von Daten in einer Schleife vermeiden: Jede Iteration erzwingt die Synchronisierung des Skripts mit der Arbeitsmappe, um sicherzustellen, dass kein Fehler ausgelöst wurde. Die meisten Fehler können vermieden werden, indem Von der Arbeitsmappe zurückgegebene Objekte überprüft werden. Das folgende Skript überprüft beispielsweise, ob die von der Arbeitsmappe zurückgegebene Tabelle vorhanden ist, bevor versucht wird, eine Zeile hinzuzufügen.

/**
 * This script adds a row to "MyTable", if that table is present.
 */
function main(workbook: ExcelScript.Workbook) {
  let table = workbook.getTable("MyTable");

  // Check if the table exists.
  if (table) {
    // Add the row.
    table.addRow(-1, ["2012", "Yes", "Maybe"]);
  } else {
    // Report the missing table.
    console.log("MyTable not found.");
  }
}

Entfernen unnötiger console.log Anweisungen

Die Konsolenprotokollierung ist ein wichtiges Tool zum Debuggen Ihrer Skripts. Es erzwingt jedoch die Synchronisierung des Skripts mit der Arbeitsmappe, um sicherzustellen, dass die protokollierten Informationen auf dem neuesten Stand sind. Erwägen Sie, unnötige Protokollierungsanweisungen (z. B. diejenigen, die zum Testen verwendet werden) zu entfernen, bevor Sie Ihr Skript freigeben. Dies führt in der Regel nicht zu einem spürbaren Leistungsproblem, es sei denn, die console.log() Anweisung befindet sich in einer Schleife.

Anhalten von Berechnungen, während die Skripts ausgeführt werden

Wenn Ihr Skript viele Werte ändert, kann es zu übermäßigen Neuberechnungen führen. Steuern Sie die Excel-Berechnungs-Engine, indem Sie den Berechnungsmodus während der Skriptausführung auf "manuell" festlegen. Verwenden Sie Application.setCalculation , um Excel zur manuellen Neuberechnung von Formeln zu wechseln. Stellen Sie sicher, dass Sie die Arbeitsmappe in den ursprünglichen Berechnungsmodus zurücksetzen, wenn Sie fertig sind.

Im folgenden Beispiel wird gezeigt, wie Sie den Berechnungsmodus ändern. Außerdem wird veranschaulicht, wie die Arbeitsmappe mit Application.calculatemanuell neu berechnet wird.

/**
 * This script adjusts the calculation mode of the workbook and makes a manual recalculation.
 * Wrap the CalculationMode changes around code that repeatedly updates values.
 */
function main(workbook: ExcelScript.Workbook) {
  const application = workbook.getApplication();

  // Turn off automatic calculations during the script.
  application.setCalculationMode(ExcelScript.CalculationMode.manual);

  // ... 

  // Perform a manual recalculation of the workbook.
  application.calculate(ExcelScript.CalculationType.fullRebuild);

  // ...

  // Resume automatic calculations after the script finishes.
  application.setCalculationMode(ExcelScript.CalculationMode.automatic);
}

Hilfe von Fall zu Fall

Da die Office-Skriptplattform erweitert wird, um mit Power Automate, adaptiven Karten und anderen produktübergreifenden Features zu arbeiten, werden die Details der Kommunikation zwischen Skripts und Arbeitsmappen komplizierter. Wenn Sie Hilfe benötigen, damit Ihr Skript schneller ausgeführt wird, wenden Sie sich an Microsoft Q&A. Markieren Sie Ihre Frage mit "office-scripts-dev", damit Experten sie finden und ihnen helfen können.

Siehe auch