إنشاء جدول أعمال للاجتماعات

مستوى الترميز:
مبتدئ المدة: 15 دقيقة
نوع المشروع: التشغيل الآلي باستخدام عامل تشغيل مستند إلى الحدث

الأهداف

  • افهم ما يفعله الحل.
  • تعرّف على ما تقوم به خدمات "برمجة تطبيقات Google" ضمن الحل.
  • ابدأ إعداد النص البرمجي.
  • شغِّل النص البرمجي.

لمحة عن هذا الحلّ

يمكنك إنشاء مستندات جدول الأعمال تلقائيًا في "مستندات Google" وإرفاقها اجتماعات "تقويم Google"

تمت إضافة لقطة شاشة من جدول الأعمال إلى حدث "تقويم Google".

آلية العمل

ينشئ النص البرمجي قالب مستند لجدول أعمال. عند تحديث يتحقّق النص البرمجي لمعرفة ما إذا كانت أي أحداث تمتلكها تتضمن "#agenda" بوصة الوصف. إذا كانت العلامة موجودة، سينشئ النص البرمجي نسخة من النموذج، وإضافته إلى حدث التقويم ومشاركته مع ضيوف الحدث.

خدمات برمجة التطبيقات

يستخدم هذا الحلّ الخدمات التالية:

  • خدمة Drive: للتحقّق مما إذا كان النموذج مستند حالي وإذا لم يكن كذلك، يتم إنشاء مجلد جديد للنموذج جلسة المراجعة. ينشئ نسخة من مستند النموذج لكل جدول أعمال جديد.
  • خدمة المستند: لإنشاء جدول الأعمال القالب.
  • خدمة التقويم: للبحث عن الأحداث التي تتضمن "#جدول أعمال" علامة وتحديث وصف الحدث برابط إلى جدول الأعمال مستند
  • الخدمة الأساسية: تستخدم الفئة Session للحصول على عنوان البريد الإلكتروني للمستخدم. يساعد هذا في إنشاء المشغل للمستخدم الحالي.
  • خدمة النص البرمجي: تنشئ مشغِّلاً يتم تنشيطه. كلما حدث تغيير في تقويم المستخدم.

المتطلبات الأساسية

لاستخدام هذا النموذج، تحتاج إلى المتطلبات الأساسية التالية:

  • حساب Google (قد يكون لدى حسابات Google Workspace طلب موافقة المشرف).
  • متصفح ويب متصل بالإنترنت.

إعداد النص البرمجي

  1. انقر على الزر أدناه لفتح النموذج إنشاء جدول أعمال للاجتماعات. مشروع برمجة التطبيقات.
    فتح المشروع
  2. انقر على رمز نظرة عامة .
  3. في صفحة النظرة العامة، انقر على رمز "إنشاء نسخة" رمز إنشاء نسخة.
  4. في المشروع المنسوخ، اختَر setUp في القائمة المنسدلة للدوال.
  5. انقر على تشغيل.
  6. امنح الإذن للنص البرمجي عندما يُطلب منك ذلك. إذا عرضت شاشة موافقة OAuth التحذير، لم يتم التحقق من هذا التطبيق، المتابعة من خلال اختيار إعدادات متقدّمة > انتقِل إلى {Project Name} (غير آمن).

تشغيل النص البرمجي

  1. افتَح تقويم Google.
  2. أنشِئ حدثًا جديدًا أو عدِّل حدثًا حاليًا.
  3. في الوصف، أضِف #agenda واحفظ الحدث.
  4. تحقَّق من بريدك الإلكتروني بحثًا عن إشعار عبر البريد الإلكتروني بأنّه تمت مشاركة مستند. معك، أو قم بتحديث التقويم وانقر على مرة أخرى لمشاهدة الرابط إلى مستند جدول الأعمال.

يتلقى جميع الحاضرين إشعارًا عبر البريد الإلكتروني لعرض جدول الأعمال. تشير رسالة الأشكال البيانية يمنح البرنامج النصي الحاضرين الإذن بتعديله، لكن يمكنك تعديل النص البرمجي من أجل تحديث أذونات مستندات جدول الأعمال للحاضرين

مراجعة الرمز البرمجي

لمراجعة رمز "برمجة تطبيقات Google" لهذا الحلّ، انقر على عرض رمز المصدر أدناه:

عرض رمز المصدر

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

التعديلات

يمكنك تعديل العيّنة بالقدر الذي تريده وفقًا لاحتياجاتك. فيما يلي بعض التغييرات الاختيارية التي يمكنك إجراؤها.

تحديث أذونات مستندات جدول الأعمال للضيوف

يمنح النص البرمجي الحاضرين الإذن بالتعديل. إذا كنت ترغب في حصر الأذونات للعرض فقط، استبدال طريقة addEditor باستخدام الطريقة addViewer في الجزء التالي من الرمز:

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

       newDoc.addEditor(guest.getEmail());

تعديل نموذج مستند جدول الأعمال

لتعديل نموذج مستند جدول الأعمال، اتّبِع الخطوات التالية:

  1. بعد إنشاء أول جدول أعمال لك في حدث في التقويم، افتح Google Drive.
  2. افتح المجلد المُسمى Agenda Maker - App.
  3. افتح مستند نموذج جدول الأعمال## وأجرِ التعديلات التي تريدها.

المساهمون

تم إنشاء هذه العينة بواسطة جيريمي غلاسنبرغ، إدارة المنتجات والنظام الأساسي مستشار استراتيجية. يمكنك البحث عن "جيريمي" على Twitter من خلال @jglassenberg.

تحتفظ Google بهذه العينة بمساعدة خبراء التطوير في Google.

الخطوات التالية