Terminübersicht für Besprechungen erstellen

Codierungslevel: Anfänger
Dauer: 15 Minuten
Projekttyp: Automatisierung mit einem ereignisgesteuerten Trigger

Zielsetzungen

  • Informieren Sie sich über die Funktionsweise der Lösung.
  • Informationen zu den Aufgaben der Apps Script-Dienste in der Lösung
  • Richten Sie das Script ein.
  • Führen Sie das Skript aus.

Informationen zu dieser Lösung

Sie können automatisch Tagesordnungsdokumente in Google Docs erstellen und an Ihre Google Kalender-Besprechungen anhängen.

Screenshot der Terminübersicht, die dem Kalendertermin hinzugefügt wurde

Funktionsweise

Das Script erstellt eine Dokumentvorlage für eine Tagesordnung. Wenn Sie Ihren Kalender aktualisieren, wird im Script geprüft, ob in der Beschreibung Ihrer Termine „#agenda“ enthalten ist. Wenn das Tag vorhanden ist, erstellt das Script eine Kopie der Vorlage, fügt sie dem Kalendertermin hinzu und gibt sie für die Teilnehmer frei.

Apps Script-Dienste

Für diese Lösung werden die folgenden Dienste verwendet:

  • Drive-Dienst: Prüft, ob das Vorlagendokument vorhanden ist. Ist das nicht der Fall, wird ein neuer Ordner für das Vorlagendokument erstellt. Es wird für jede neue Tagesordnung eine Kopie des Vorlagendokuments erstellt.
  • Dokumentdienst: Hiermit wird die Vorlage für die Tagesordnung erstellt.
  • Kalenderdienst: Prüft auf Termine mit dem Tag „#agenda“ und aktualisiert die Terminbeschreibung mit einem Link zum Agendadokument.
  • Base service (Basisdienst): Hier wird die Klasse Session verwendet, um die E-Mail-Adresse des Nutzers abzurufen. So lässt sich der Trigger für den aktuellen Nutzer erstellen.
  • Script-Dienst: Erstellt einen Trigger, der ausgelöst wird, wenn sich der Kalender des Nutzers ändert.

Vorbereitung

Für die Verwendung dieses Beispiels sind die folgenden Voraussetzungen erforderlich:

  • Ein Google-Konto (für Google Workspace-Konten ist möglicherweise die Administratorzustimmung erforderlich).
  • Einen Webbrowser mit Internetzugriff.

Script einrichten

  1. Klicken Sie auf die Schaltfläche unten, um das Beispiel-Apps Script-Projekt Eine Tagesordnung für Besprechungen erstellen zu öffnen.
    Projekt öffnen
  2. Klicken Sie auf Übersicht .
  3. Klicken Sie auf der Übersichtsseite auf „Kopie erstellen“ Das Symbol zum Erstellen einer Kopie.
  4. Wählen Sie in Ihrem kopierten Projekt im Drop-down-Menü „Funktion“ die Option setUp aus.
  5. Klicken Sie auf Ausführen.
  6. Autorisieren Sie das Script, wenn Sie dazu aufgefordert werden. Wenn auf dem OAuth-Zustimmungsbildschirm die Warnung Diese App ist nicht bestätigt angezeigt wird, wählen Sie Erweitert > Zu {Project Name} (unsicher) aus.

Skript ausführen

  1. Öffnen Sie Google Kalender.
  2. Erstellen oder bearbeiten Sie einen Termin.
  3. Fügen Sie in der Beschreibung #agenda hinzu und speichern Sie den Termin.
  4. Prüfen Sie Ihren Posteingang auf eine E-Mail-Benachrichtigung, dass ein Dokument für Sie freigegeben wurde, oder aktualisieren Sie den Kalender und klicken Sie noch einmal auf den Termin, um den Link zum Agendadokument aufzurufen.

Alle Teilnehmer erhalten eine E-Mail-Benachrichtigung, um sich die Agenda anzusehen. Das Script gewährt den Teilnehmern die Berechtigung zum Bearbeiten. Sie können das Script jedoch bearbeiten, um die Berechtigungen für das Agendadokument für die Teilnehmer zu aktualisieren.

Code ansehen

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

Quellcode ansehen

Code.gs

solutions/automations/agenda-maker/Code.js
// To learn how to use this script, refer to the documentation:
// https://developers.google.com/apps-script/samples/automations/agenda-maker

/*
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.
*/

/**
 * Checks if the folder for Agenda docs exists, and creates it if it doesn't.
 *
 * @return {*} Drive folder ID for the app.
 */
function checkFolder() {
  const folders = DriveApp.getFoldersByName('Agenda Maker - App');
  // Finds the folder if it exists
  while (folders.hasNext()) {
    let folder = folders.next();
    if (
      folder.getDescription() ==
        'Apps Script App - Do not change this description' &&
      folder.getOwner().getEmail() == Session.getActiveUser().getEmail()
    ) {
      return folder.getId();
    }
  }
  // If the folder doesn't exist, creates one
  let folder = DriveApp.createFolder('Agenda Maker - App');
  folder.setDescription('Apps Script App - Do not change this description');
  return folder.getId();
}

/**
 * Finds the template agenda doc, or creates one if it doesn't exist.
 */
function getTemplateId(folderId) {
  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFilesByName('Agenda TEMPLATE##');

  // If there is a file, returns the ID.
  while (files.hasNext()) {
    const file = files.next();
    return file.getId();
  }

  // Otherwise, creates the agenda template.
  // You can adjust the default template here
  const doc = DocumentApp.create('Agenda TEMPLATE##');
  const body = doc.getBody();

  body
      .appendParagraph('##Attendees##')
      .setHeading(DocumentApp.ParagraphHeading.HEADING1)
      .editAsText()
      .setBold(true);
  body.appendParagraph(' ').editAsText().setBold(false);

  body
      .appendParagraph('Overview')
      .setHeading(DocumentApp.ParagraphHeading.HEADING1)
      .editAsText()
      .setBold(true);
  body.appendParagraph(' ');
  body.appendParagraph('- Topic 1: ').editAsText().setBold(true);
  body.appendParagraph(' ').editAsText().setBold(false);
  body.appendParagraph('- Topic 2: ').editAsText().setBold(true);
  body.appendParagraph(' ').editAsText().setBold(false);
  body.appendParagraph('- Topic 3: ').editAsText().setBold(true);
  body.appendParagraph(' ').editAsText().setBold(false);

  body
      .appendParagraph('Next Steps')
      .setHeading(DocumentApp.ParagraphHeading.HEADING1)
      .editAsText()
      .setBold(true);
  body.appendParagraph('- Takeaway 1: ').editAsText().setBold(true);
  body.appendParagraph('- Responsible: ').editAsText().setBold(false);
  body.appendParagraph('- Accountable: ');
  body.appendParagraph('- Consult: ');
  body.appendParagraph('- Inform: ');
  body.appendParagraph(' ');
  body.appendParagraph('- Takeaway 2: ').editAsText().setBold(true);
  body.appendParagraph('- Responsible: ').editAsText().setBold(false);
  body.appendParagraph('- Accountable: ');
  body.appendParagraph('- Consult: ');
  body.appendParagraph('- Inform: ');
  body.appendParagraph(' ');
  body.appendParagraph('- Takeaway 3: ').editAsText().setBold(true);
  body.appendParagraph('- Responsible: ').editAsText().setBold(false);
  body.appendParagraph('- Accountable: ');
  body.appendParagraph('- Consult: ');
  body.appendParagraph('- Inform: ');

  doc.saveAndClose();

  folder.addFile(DriveApp.getFileById(doc.getId()));

  return doc.getId();
}

/**
 * When there is a change to the calendar, searches for events that include "#agenda"
 * in the decrisption.
 *
 */
function onCalendarChange() {
  // Gets recent events with the #agenda tag
  const now = new Date();
  const events = CalendarApp.getEvents(
      now,
      new Date(now.getTime() + 2 * 60 * 60 * 1000000),
      {search: '#agenda'},
  );

  const folderId = checkFolder();
  const templateId = getTemplateId(folderId);

  const folder = DriveApp.getFolderById(folderId);

  // Loops through any events found
  for (i = 0; i < events.length; i++) {
    const event = events[i];

    // Confirms whether the event has the #agenda tag
    let description = event.getDescription();
    if (description.search('#agenda') == -1) continue;

    // Only works with events created by the owner of this calendar
    if (event.isOwnedByMe()) {
      // Creates a new document from the template for an agenda for this event
      const newDoc = DriveApp.getFileById(templateId).makeCopy();
      newDoc.setName('Agenda for ' + event.getTitle());

      const file = DriveApp.getFileById(newDoc.getId());
      folder.addFile(file);

      const doc = DocumentApp.openById(newDoc.getId());
      const body = doc.getBody();

      // Fills in the template with information about the attendees from the
      // calendar event
      const conf = body.findText('##Attendees##');
      if (conf) {
        const ref = conf.getStartOffset();

        for (let i in event.getGuestList()) {
          let guest = event.getGuestList()[i];

          body.insertParagraph(ref + 2, guest.getEmail());
        }
        body.replaceText('##Attendees##', 'Attendees');
      }

      // Replaces the tag with a link to the agenda document
      const agendaUrl = 'https://docs.google.com/document/d/' + newDoc.getId();
      description = description.replace(
          '#agenda',
          '<a href=' + agendaUrl + '>Agenda Doc</a>',
      );
      event.setDescription(description);

      // Invites attendees to the Google doc so they automatically receive access to the agenda
      newDoc.addEditor(newDoc.getOwner());

      for (let i in event.getGuestList()) {
        let guest = event.getGuestList()[i];

        newDoc.addEditor(guest.getEmail());
      }
    }
  }
  return;
}

/**
 * Creates an event-driven trigger that fires whenever there's a change to the calendar.
 */
function setUp() {
  let email = Session.getActiveUser().getEmail();
  ScriptApp.newTrigger("onCalendarChange").forUserCalendar(email).onEventUpdated().create();
}

Änderungen

Sie können das Sample nach Belieben bearbeiten. Im Folgenden finden Sie einige optionale Änderungen, die Sie vornehmen können.

Berechtigungen für das Tagesordnungsdokument für Teilnehmer aktualisieren

Das Script gewährt den Teilnehmern die Berechtigung zum Bearbeiten. Wenn Sie die Berechtigungen nur auf die Anzeige beschränken möchten, ersetzen Sie im folgenden Codeabschnitt die Methode addEditor durch die Methode addViewer:

     for (let i in event.getGuestList()) {
       let guest = event.getGuestList()[i];

       newDoc.addEditor(guest.getEmail());

Vorlage für das Dokument „Agenda“ bearbeiten

So aktualisieren Sie die Vorlage für das Agendadokument:

  1. Nachdem Sie Ihre erste Agenda in einem Kalendertermin erstellt haben, öffnen Sie Google Drive.
  2. Öffnen Sie den Ordner Agenda Maker – App.
  3. Öffne das Dokument Agenda TEMPLATE## und nimm die gewünschten Änderungen vor.

Beitragende

Dieses Muster wurde von Jeremy Glassenberg, Berater für Produktmanagement und Plattformstrategie, erstellt. Jeremy finden Sie auf Twitter unter @jglassenberg.

Dieses Beispiel wird von Google mithilfe von Google Developer Experts verwaltet.

Nächste Schritte