إنشاء اشتراك في الجلسات في مكالمة فيديو

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

الأهداف

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

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

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

المعلومات من "جداول بيانات Google" التي يتم نقلها إلى "نماذج Google" و"تقويم Google"

طريقة العمل

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

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

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

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

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

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

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

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

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

  4. انقر على مكالمة فيديو > إعداد مكالمة فيديو مرة أخرى.

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

  1. انقر على أدوات > إدارة النموذج > الانتقال إلى النموذج المباشر.
  2. املأ النموذج وأرسِله.
  3. انتقِل إلى calendar.google.com.
  4. على يمين الصفحة، تأكَّد من وضع علامة في المربّع بجانب تقويم المؤتمرات.
  5. انتقِل إلى تواريخ الأحداث التي اشتركت فيها وتأكّد من إضافتك كضيف.

(اختياري) إعادة ضبط الحلّ

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

إعادة ضبط الحلّ

الخطوة 1: إعادة ضبط خصائص النص البرمجي المخزَّنة

إذا حاولت تشغيل النص البرمجي أكثر من مرة، سيُطلب منك ذلك بأنّه سبق أن تم إعداد مكالمة الفيديو. ابحث في Google Drive عن نموذج الاشتراك. يحدث ذلك لأنّه بعد إنشاء "تقويم المؤتمرات"، يتم تخزين رقم تعريف التقويم كموقع نص برمجي. عند تشغيل النص البرمجي، يتحقّق مما إذا كانت خاصية رقم تعريف التقويم متوفّرة من قبل، ويتوقّف تشغيلها إذا كانت متوفّرة.

اتّبِع الخطوات التالية لإزالة خاصية رقم تعريف التقويم الحالي:

  1. في جدول البيانات، انقر على الإضافات > برمجة التطبيقات.
  2. في محرِّر "برمجة تطبيقات Google"، اختَر resetProperties من القائمة المنسدلة للدوال وانقر على تشغيل.

الخطوة 2: حذف "تقويم مكالمة الفيديو"

في كل مرة يتم فيها تشغيل النص البرمجي، يتم إنشاء تقويم جديد. إذا كنت لا تريد الاحتفاظ بالتقويم الأصلي الذي تم إنشاؤه، اتّبِع الخطوات التالية:

  1. انتقِل إلى calendar.google.com.
  2. بجانب "تقويم المؤتمرات"، انقر على خيارات "تقويم المؤتمرات" > الإعدادات والمشاركة.
  3. انتقِل إلى أسفل الإعدادات وانقر على حذف.

الخطوة 3: حذف مشغِّل إرسال النموذج

ينشئ النص البرمجي مشغلاً لعمليات إرسال النماذج في كل مرة تقوم فيها بتشغيله. لتجنُّب وجود عدة عوامل تشغيل تؤدي إلى ظهور رسائل إلكترونية مكرّرة، عليك إزالة العامل الأصلي. يُرجى اتّباع الخطوات التالية:

  1. في جدول البيانات، انقر على الإضافات > برمجة التطبيقات.
  2. في مشروع "برمجة التطبيقات"، انقر على العوامل المشغِّلة على يمين الصفحة.
  3. بجانب المشغّل، انقر على رمز المزيد > حذف المشغِّل.

في كل مرة تقوم فيها بتشغيل النص البرمجي، يتم إنشاء نموذج جديد. اتّبِع الخطوات التالية لإلغاء ربط النموذج بجدول البيانات وحذفه:

  1. في جدول البيانات، انقر بزر الماوس الأيمن على ورقة بيانات الردود على النموذج، ثم انقر على إلغاء ربط النموذج > حسنًا.
  2. انقر بزر الماوس الأيمن على ورقة الردود على النموذج مرة أخرى وانقر على حذف > حسنًا.
  3. انتقِل إلى forms.google.com.
  4. انقر بزر الماوس الأيمن على نموذج المؤتمر وانقر على إزالة > نقل إلى المهملات.

بعد إعادة ضبط الحلّ، يمكنك إضافة بياناتك الخاصة أو مواصلة استخدام عيّنة البيانات وتنفيذ النص البرمجي مرّة أخرى.

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

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

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

Code.gs

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

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

/**
 * Inserts a custom menu when the spreadsheet opens.
 */
function onOpen() {
  SpreadsheetApp.getUi().createMenu('Conference')
      .addItem('Set up conference', 'setUpConference_')
      .addToUi();
}

/**
 * Uses the conference data in the spreadsheet to create
 * Google Calendar events, a Google Form, and a trigger that allows the script
 * to react to form responses.
 */
function setUpConference_() {
  let scriptProperties = PropertiesService.getScriptProperties();
  if (scriptProperties.getProperty('calId')) {
    Browser.msgBox('Your conference is already set up. Look in Google Drive for your'
                   + ' sign-up form!');
                   return;
  }
  let ss = SpreadsheetApp.getActive();
  let sheet = ss.getSheetByName('Conference Setup');
  let range = sheet.getDataRange();
  let values = range.getValues();
  setUpCalendar_(values, range);
  setUpForm_(ss, values);
  ScriptApp.newTrigger('onFormSubmit').forSpreadsheet(ss).onFormSubmit()
      .create();
}

/**
 * Creates a Google Calendar with events for each conference session in the
 * spreadsheet, then writes the event IDs to the spreadsheet for future use.
 * @param {Array<string[]>} values Cell values for the spreadsheet range.
 * @param {Range} range A spreadsheet range that contains conference data.
 */
function setUpCalendar_(values, range) {
  let cal = CalendarApp.createCalendar('Conference Calendar');
  // Start at 1 to skip the header row.
  for (let i = 1; i < values.length; i++) {
    let session = values[i];
    let title = session[0];
    let start = joinDateAndTime_(session[1], session[2]);
    let end = joinDateAndTime_(session[1], session[3]);
    let options = {location: session[4], sendInvites: true};
    let event = cal.createEvent(title, start, end, options)
        .setGuestsCanSeeGuests(false);
    session[5] = event.getId();
  }
  range.setValues(values);

  // Stores the ID for the Calendar, which is needed to retrieve events by ID.
  let scriptProperties = PropertiesService.getScriptProperties();
  scriptProperties.setProperty('calId', cal.getId());
}

/**
 * Creates a single Date object from separate date and time cells.
 *
 * @param {Date} date A Date object from which to extract the date.
 * @param {Date} time A Date object from which to extract the time.
 * @return {Date} A Date object representing the combined date and time.
 */
function joinDateAndTime_(date, time) {
  date = new Date(date);
  date.setHours(time.getHours());
  date.setMinutes(time.getMinutes());
  return date;
}

/**
 * Creates a Google Form that allows respondents to select which conference
 * sessions they would like to attend, grouped by date and start time in the
 * caller's time zone.
 *
 * @param {Spreadsheet} ss The spreadsheet that contains the conference data.
 * @param {Array<String[]>} values Cell values for the spreadsheet range.
 */
function setUpForm_(ss, values) {
  // Group the sessions by date and time so that they can be passed to the form.
  let schedule = {};
  // Start at 1 to skip the header row.
  for (let i = 1; i < values.length; i++) {
    let session = values[i];
    let day = session[1].toLocaleDateString();
    let time = session[2].toLocaleTimeString();
    if (!schedule[day]) {
      schedule[day] = {};
    }
    if (!schedule[day][time]) {
      schedule[day][time] = [];
    }
    schedule[day][time].push(session[0]);
  }

  // Creates the form and adds a multiple-choice question for each timeslot.
  let form = FormApp.create('Conference Form');
  form.setDestination(FormApp.DestinationType.SPREADSHEET, ss.getId());
  form.addTextItem().setTitle('Name').setRequired(true);
  form.addTextItem().setTitle('Email').setRequired(true);
  Object.keys(schedule).forEach(function(day) {
    let header = form.addSectionHeaderItem().setTitle('Sessions for ' + day);
    Object.keys(schedule[day]).forEach(function(time) {
      let item = form.addMultipleChoiceItem().setTitle(time + ' ' + day)
          .setChoiceValues(schedule[day][time]);
    });
  });
}

/**
 * Sends out calendar invitations and a
 * personalized Google Docs itinerary after a user responds to the form.
 *
 * @param {Object} e The event parameter for form submission to a spreadsheet;
 *     see https://developers.google.com/apps-script/understanding_events
 */
function onFormSubmit(e) {
  let user = {name: e.namedValues['Name'][0], email: e.namedValues['Email'][0]};

  // Grab the session data again so that we can match it to the user's choices.
  let response = [];
  let values = SpreadsheetApp.getActive().getSheetByName('Conference Setup')
      .getDataRange().getValues();
  for (let i = 1; i < values.length; i++) {
    let session = values[i];
    let title = session[0];
    let day = session[1].toLocaleDateString();
    let time = session[2].toLocaleTimeString();
    let timeslot = time + ' ' + day;

    // For every selection in the response, find the matching timeslot and title
    // in the spreadsheet and add the session data to the response array.
    if (e.namedValues[timeslot] && e.namedValues[timeslot] == title) {
      response.push(session);
    }
  }
  sendInvites_(user, response);
  sendDoc_(user, response);
}

/**
 * Add the user as a guest for every session he or she selected.
 * @param {object} user An object that contains the user's name and email.
 * @param {Array<String[]>} response An array of data for the user's session choices.
 */
function sendInvites_(user, response) {
  let id = ScriptProperties.getProperty('calId');
  let cal = CalendarApp.getCalendarById(id);
  for (let i = 0; i < response.length; i++) {
    cal.getEventSeriesById(response[i][5]).addGuest(user.email);
  }
}

/**
 * Creates and shares a personalized Google Doc that shows the user's itinerary.
 * @param {object} user An object that contains the user's name and email.
 * @param {Array<string[]>} response An array of data for the user's session choices.
 */
function sendDoc_(user, response) {
  let doc = DocumentApp.create('Conference Itinerary for ' + user.name)
      .addEditor(user.email);
  let body = doc.getBody();
  let table = [['Session', 'Date', 'Time', 'Location']];
  for (let i = 0; i < response.length; i++) {
    table.push([response[i][0], response[i][1].toLocaleDateString(),
      response[i][2].toLocaleTimeString(), response[i][4]]);
  }
  body.insertParagraph(0, doc.getName())
      .setHeading(DocumentApp.ParagraphHeading.HEADING1);
  table = body.appendTable(table);
  table.getRow(0).editAsText().setBold(true);
  doc.saveAndClose();

  // Emails a link to the Doc as well as a PDF copy.
  MailApp.sendEmail({
    to: user.email,
    subject: doc.getName(),
    body: 'Thanks for registering! Here\'s your itinerary: ' + doc.getUrl(),
    attachments: doc.getAs(MimeType.PDF),
  });
}

/**
 * Removes the calId script property so that the 'setUpConference_()' can be run again.
 */
function resetProperties(){
  let scriptProperties = PropertiesService.getScriptProperties();
  scriptProperties.deleteAllProperties();
}

المساهمون

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

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