Terminübersicht für Besprechungen erstellen

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

Ziele

  • Verstehen, was die Lösung bewirkt.
  • Informationen zur Funktionsweise der Apps Script-Dienste in der Lösung.
  • Richten Sie das Skript ein.
  • Führen Sie das Skript aus.

Informationen zu dieser Lösung

Erstellen Sie automatisch eine Agenda in Google Docs und fügen Sie sie Ihren Google Kalender-Terminen hinzu.

Screenshot einer Terminübersicht, die einem Kalendertermin hinzugefügt wurde

Funktionsweise

Das Script erstellt eine Vorlage für eine Agenda. Wenn Sie Ihren Kalender aktualisieren, wird geprüft, ob in der Beschreibung Ihrer Termine das Tag „#agenda“ enthalten ist. Wenn das der Fall ist, erstellt das Script eine Kopie der Vorlage, fügt sie dem Kalendertermin hinzu und teilt sie mit den jeweiligen Teilnehmern.

Apps Script-Dienste

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

  • Drive-Dienst: Prüft, ob das Vorlagendokument vorhanden ist. Falls nicht, wird ein neuer Ordner für das Vorlagendokument erstellt. Erstellt für jede neue Agenda eine Kopie des Vorlagendokuments.
  • Dokumentdienst: Erstellt die Agendavorlage.
  • Kalenderdienst: Es wird nach Terminen mit dem Tag „#agenda“ gesucht und die Terminbeschreibung wird mit einem Link zum Agendadokument aktualisiert.
  • Basisservice: Hier wird die Session-Klasse verwendet, um die E-Mail-Adresse des Nutzers abzurufen. So wird der Trigger für den aktuellen Nutzer erstellt.
  • Script-Dienst: Erstellt einen Trigger, der ausgelöst wird, wenn sich der Kalender des Nutzers ändert.

Vorbereitung

Für dieses Beispiel 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.

Skript einrichten

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

Skript ausführen

  1. Öffnen Sie Google Kalender.
  2. Erstellen Sie einen neuen Termin oder bearbeiten Sie einen vorhandenen.
  3. Fügen Sie der Beschreibung #agenda hinzu und speichern Sie den Termin.
  4. Suchen Sie in Ihrem Posteingang nach einer E‑Mail-Benachrichtigung, dass ein Dokument mit Ihnen geteilt wurde, oder aktualisieren Sie den Kalender und klicken Sie noch einmal auf den Termin, um den Link zum Agendadokument aufzurufen.

Alle Teilnehmer erhalten die E‑Mail-Benachrichtigung, um die Agenda aufzurufen. Das Skript erteilt den Teilnehmern die Berechtigung zum Bearbeiten. Sie können das Skript 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 Beispiel nach Bedarf bearbeiten. Hier sind einige optionale Änderungen, die Sie vornehmen können.

Berechtigungen für das Agendadokument für Teilnehmer aktualisieren

Das Skript gewährt Teilnehmern die Berechtigung zum Bearbeiten. Wenn Sie die Berechtigungen auf „Nur ansehen“ beschränken möchten, ersetzen Sie die addEditor-Methode im folgenden Teil des Codes durch die addViewer-Methode:

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

       newDoc.addEditor(guest.getEmail());

Tagesordnungsvorlage 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. Öffnen Sie das Dokument Agenda TEMPLATE## und nehmen Sie die gewünschten Änderungen vor.

Beitragende

Dieses Beispiel wurde von Jeremy Glassenberg, Product Management and Platform Strategy Consultant, erstellt. Du findest Jeremy auf Twitter unter @jglassenberg.

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

Nächste Schritte