Daten aus mehreren Tabellenblättern zusammenfassen

Programmierkenntnisse: Anfänger
Dauer: 5 Minuten
Projekttyp: Benutzerdefinierte Funktion

Ziele

  • Verstehen, was die Lösung tut
  • Verstehen, wie die Apps Script-Dienste in der Lösung funktionieren
  • Das Script einrichten
  • Das Script ausführen.

Informationen zu dieser Lösung

Wenn Sie in einer Tabelle ähnlich strukturierte Daten auf mehreren Blättern haben, zum Beispiel Messwerte des Kundensupports für einzelne Teammitglieder, können Sie mit dieser benutzerdefinierten Funktion eine Zusammenfassung für jedes Blatt erstellen. Diese Lösung wurde für Kundensupport-Tickets entwickelt, kann aber an Ihre Anforderungen angepasst werden.

Zusammenfassungstabelle, die von der Funktion „getSheetsData“ generiert wurde und die Anzahl der Ticketstatus enthält.

Funktionsweise

Die benutzerdefinierte Funktion getSheetsData() fasst Daten aus jedem Blatt in der Tabelle basierend auf der Spalte Status des Blatts zusammen. Das Script ignoriert Blätter, die nicht in die Aggregation einbezogen werden sollen, z. B. die Blätter ReadMe und Zusammenfassung.

Apps Script-Dienste

Diese Lösung verwendet den folgenden Dienst:

  • Tabellenkalkulationsdienst: Ruft die Blätter ab, die zusammengefasst werden müssen, und zählt die Anzahl der Elemente, die einem bestimmten String entsprechen. Anschließend fügt das Script die berechneten Informationen einem Bereich hinzu, der sich relativ zu der Stelle befindet, an der die benutzerdefinierte Funktion in der Tabelle aufgerufen wurde.

Vorbereitung

Für die Verwendung dieses Beispiels müssen die folgenden Voraussetzungen erfüllt sein:

  • Ein Google-Konto (für Google Workspace-Konten ist möglicherweise die Genehmigung durch den Administrator erforderlich)
  • Ein Webbrowser mit Internetzugriff

Script einrichten

Wenn Sie eine Kopie der Tabelle Benutzerdefinierte Funktion zum Zusammenfassen von Tabellendaten erstellen möchten, klicken Sie auf die folgende Schaltfläche:

Kopie erstellen

Das Apps Script-Projekt für diese Lösung ist an die Tabelle angehängt.

Das Script ausführen

  1. Rufen Sie in der kopierten Tabelle das Blatt Zusammenfassung auf.
  2. Klicken Sie auf Zelle A4. Die Funktion getSheetsData() befindet sich in dieser Zelle.
  3. Rufen Sie eines der Inhaberblätter auf und aktualisieren oder fügen Sie Daten zum Blatt hinzu. Einige mögliche Aktionen:
    • Fügen Sie eine neue Zeile mit Ticketbeispielinformationen hinzu.
    • Ändern Sie in der Spalte Status den Status eines vorhandenen Tickets.
    • Ändern Sie die Position der Spalte Status. Verschieben Sie beispielsweise im Blatt Inhaber1 die Spalte Status von Spalte C nach Spalte D.
  4. Rufen Sie das Blatt Zusammenfassung auf und sehen Sie sich die aktualisierte Zusammenfassungstabelle an, die mit getSheetsData() aus Zelle A4 erstellt wurde. Möglicherweise müssen Sie das Kästchen in Zeile 10 aktivieren, um die im Cache gespeicherten Ergebnisse der benutzerdefinierten Funktion zu aktualisieren. Google speichert benutzerdefinierte Funktionen im Cache, um die Leistung zu optimieren.
    • Wenn Sie Zeilen hinzugefügt oder aktualisiert haben, werden die Ticket- und Statuszahlen vom Script aktualisiert.
    • Wenn Sie die Position der Spalte Status verschoben haben, funktioniert das Script weiterhin wie vorgesehen mit dem neuen Spaltenindex.

Code ansehen

Wenn Sie den Apps Script-Code für diese Lösung ansehen möchten, klicken Sie auf Quellcode ansehen:

Quellcode ansehen

Code.gs

solutions/custom-functions/summarize-sheets-data/Code.js
// To learn how to use this script, refer to the documentation:
// https://developers.google.com/apps-script/samples/custom-functions/summarize-sheets-data

/*
Copyright 2022 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

/**
 * Gets summary data from other sheets. The sheets you want to summarize must have columns with headers that match the names of the columns this function summarizes data from.
 *
 * @return {string} Summary data from other sheets.
 * @customfunction
 */

// The following sheets are ignored. Add additional constants for other sheets that should be ignored.
const READ_ME_SHEET_NAME = "ReadMe";
const PM_SHEET_NAME = "Summary";

/**
 * Reads data ranges for each sheet. Filters and counts based on 'Status' columns. To improve performance, the script uses arrays
 * until all summary data is gathered. Then the script writes the summary array starting at the cell of the custom function.
 */
function getSheetsData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheets = ss.getSheets();
  const outputArr = [];

  // For each sheet, summarizes the data and pushes to a temporary array.
  for (const s in sheets) {
    // Gets sheet name.
    const sheetNm = sheets[s].getName();
    // Skips ReadMe and Summary sheets.
    if (sheetNm === READ_ME_SHEET_NAME || sheetNm === PM_SHEET_NAME) {
      continue;
    }
    // Gets sheets data.
    const values = sheets[s].getDataRange().getValues();
    // Gets the first row of the sheet which is the header row.
    const headerRowValues = values[0];
    // Finds the columns with the heading names 'Owner Name' and 'Status' and gets the index value of each.
    // Using 'indexOf()' to get the position of each column prevents the script from breaking if the columns change positions in a sheet.
    const columnOwner = headerRowValues.indexOf("Owner Name");
    const columnStatus = headerRowValues.indexOf("Status");
    // Removes header row.
    values.splice(0, 1);
    // Gets the 'Owner Name' column value by retrieving the first data row in the array.
    const owner = values[0][columnOwner];
    // Counts the total number of tasks.
    const taskCnt = values.length;
    // Counts the number of tasks that have the 'Complete' status.
    // If the options you want to count in your spreadsheet differ, update the strings below to match the text of each option.
    // To add more options, copy the line below and update the string to the new text.
    const completeCnt = filterByPosition(
      values,
      "Complete",
      columnStatus,
    ).length;
    // Counts the number of tasks that have the 'In-Progress' status.
    const inProgressCnt = filterByPosition(
      values,
      "In-Progress",
      columnStatus,
    ).length;
    // Counts the number of tasks that have the 'Scheduled' status.
    const scheduledCnt = filterByPosition(
      values,
      "Scheduled",
      columnStatus,
    ).length;
    // Counts the number of tasks that have the 'Overdue' status.
    const overdueCnt = filterByPosition(values, "Overdue", columnStatus).length;
    // Builds the output array.
    outputArr.push([
      owner,
      taskCnt,
      completeCnt,
      inProgressCnt,
      scheduledCnt,
      overdueCnt,
      sheetNm,
    ]);
  }
  // Writes the output array.
  return outputArr;
}

/**
 * Below is a helper function that filters a 2-dimenstional array.
 */
function filterByPosition(array, find, position) {
  return array.filter((innerArray) => innerArray[position] === find);
}

Änderungen

Sie können die benutzerdefinierte Funktion beliebig oft bearbeiten, um sie an Ihre Anforderungen anzupassen. Wenn Sie eine optionale Ergänzung zum manuellen Aktualisieren der Ergebnisse der benutzerdefinierten Funktion sehen möchten, klicken Sie auf Im Cache gespeicherte Ergebnisse aktualisieren:

Im Cache gespeicherte Ergebnisse aktualisieren

Im Gegensatz zu integrierten Funktionen speichert Google benutzerdefinierte Funktionen im Cache, um die Leistung zu optimieren. Wenn Sie also etwas in Ihrer benutzerdefinierten Funktion ändern, z. B. einen berechneten Wert, wird möglicherweise nicht sofort eine Aktualisierung erzwungen. So aktualisieren Sie das Ergebnis der Funktion manuell:

  1. Fügen Sie einer leeren Zelle ein Kästchen hinzu, indem Sie auf Einfügen > Kästchen klicken.
  2. Fügen Sie die Zelle mit dem Kästchen als Parameter der benutzerdefinierten Funktion hinzu, z. B. getSheetsData(B11).
  3. Aktivieren oder deaktivieren Sie das Kästchen, um die Ergebnisse der benutzerdefinierten Funktion zu aktualisieren.

Beitragende

Dieses Beispiel wird von Google mit Unterstützung von Google Developer Experts verwaltet.

Nächste Schritte