Terminübersicht für Besprechungen erstellen

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

Zielsetzungen

  • Verstehen Sie, was die Lösung bewirkt.
  • Informieren Sie sich darüber, was die Apps Script-Dienste innerhalb der Lösung leisten.
  • Richten Sie das Skript ein.
  • Führen Sie das Skript aus.

Informationen zu dieser Lösung

Erstellen Sie automatisch Tagesordnungsdokumente in Google Docs und hängen Sie sie an Ihre Google Kalender-Besprechungen an.

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

Funktionsweise

Das Skript erstellt eine Dokumentvorlage für eine Agenda. Wenn Sie Ihren Kalender aktualisieren, prüft das Skript, ob Ihre Termine das Wort „#agenda“ in der Beschreibung enthalten. Wenn das Tag vorhanden ist, erstellt das Skript eine Kopie der Vorlage, fügt sie dem Kalendertermin hinzu und gibt sie für die Teilnehmer des Termins frei.

Apps Script-Dienste

Diese Lösung verwendet die folgenden Dienste:

  • Drive-Dienst: Überprüft, ob das Vorlagendokument vorhanden ist. Falls nicht, wird ein neuer Ordner für das Vorlagendokument erstellt. Eine Kopie der Vorlage wird für jede neue Agenda erstellt.
  • Document service (Dokumentdienst): Erstellt die Agendavorlage.
  • Kalenderdienst: Sucht nach Terminen mit dem Tag "#agenda" und aktualisiert die Terminbeschreibung mit einem Link zum Dokument mit der Agenda.
  • Basisdienst: Verwendet die Klasse Session, um die E-Mails des Nutzers abzurufen. Dies hilft beim Erstellen des Triggers für den aktuellen Nutzer.
  • Skriptdienst: Erstellt einen Trigger, der ausgelöst wird, wenn am Kalender des Nutzers eine Änderung vorgenommen wird.

Voraussetzungen

Um dieses Beispiel zu verwenden, müssen die folgenden Voraussetzungen erfüllt sein:

  • Ein Google-Konto (für Google Workspace-Konten ist möglicherweise die Administratorgenehmigung erforderlich).
  • Ein Webbrowser mit Zugang zum Internet.

Skript einrichten

  1. Klicken Sie auf die Schaltfläche unten, um das Apps Script-Beispielprojekt Agenda für Meetings 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 im kopierten Projekt im Drop-down-Menü „Funktion“ 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 Anwendung wurde nicht überprüft 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 in der Beschreibung #agenda hinzu und speichern Sie den Termin.
  4. Suchen Sie in Ihrem Posteingang nach einer E-Mail-Benachrichtigung, dass ein Dokument für Sie freigegeben wurde, oder aktualisieren Sie Google Kalender und klicken Sie noch einmal auf den Termin, um den Link zum Dokument mit der Agenda anzuzeigen.

Alle Teilnehmer erhalten eine E-Mail-Benachrichtigung, über die sie die Terminübersicht aufrufen können. Das Skript erteilt den Teilnehmern die Berechtigung zum Bearbeiten, Sie können es jedoch bearbeiten, um die Berechtigungen für das Agendadokument für die Teilnehmer zu aktualisieren.

Code ansehen

Klicken Sie unten auf Quellcode anzeigen, um den Apps Script-Code für diese Lösung zu sehen:

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();
}

Abwandlung

Sie können die Stichprobe nach Belieben bearbeiten. Nachfolgend finden Sie einige optionale Änderungen, die Sie vornehmen können.

Dokumentberechtigungen für die Agenda für Teilnehmer aktualisieren

Das Skript erteilt den Teilnehmenden die Berechtigung zum Bearbeiten. Wenn Sie die Berechtigungen auf Lesezugriff beschränken möchten, ersetzen Sie die Methode addEditor im folgenden Teil des Codes durch die Methode addViewer:

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

       newDoc.addEditor(guest.getEmail());

Dokumentvorlage für die Agenda bearbeiten

So aktualisieren Sie die Vorlage für ein Tagesordnungsdokument:

  1. Öffnen Sie Google Drive, nachdem Sie Ihre erste Terminübersicht in einem Kalendertermin erstellt haben.
  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. Suche Jeremy auf Twitter unter @jglassenberg.

Dieses Beispiel wird von Google mit der Unterstützung von Google Developers-Experten gepflegt.

Nächste Schritte