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

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

الأهداف

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

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

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

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

آلية العمل

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

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

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

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

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

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

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

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

  1. انقر على الزر التالي لإنشاء نسخة من نموذج جدول البيانات إنشاء اشتراك في جلسات في مؤتمر. تم إرفاق مشروع "برمجة تطبيقات Google" لهذا الحل بجدول البيانات.
    إنشاء نسخة
  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. بجانب "تقويم مكالمة الفيديو"، انقر على خيارات "تقويم Google" > الإعدادات والمشاركة.
  3. انتقِل إلى الجزء السفلي من الإعدادات وانقر على حذف.

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

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

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

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

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

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

مراجعة الرمز

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

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

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.

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