مستوى الترميز: مبتدئ
المدة: 5 دقائق
نوع المشروع: التشغيل الآلي من خلال قائمة مخصّصة
عامل تشغيل مستند إلى الحدث
الأهداف
- افهم ما يفعله الحل.
- تعرّف على ما تقوم به خدمات "برمجة تطبيقات Google" ضمن
الحل.
- ابدأ إعداد النص البرمجي.
- شغِّل النص البرمجي.
لمحة عن هذا الحلّ
إنشاء نظام تسجيل شامل للأحداث. إذا كان لديك حدث
القادمة، مثل المؤتمرات، يمكنك إعداد تقويم جديد
الجلسات وإنشاء نموذج اشتراك وإرسال رسائل إلكترونية تلقائيًا إلى الحاضرين
وبرامج الرحلات.
![المعلومات من "جداول بيانات Google" التي يتم نقلها إلى "نماذج Google" و"تقويم Google"](https://developers-dot-devsite-v2-prod.appspot.com/static/apps-script/samples/images/event-signup.jpeg?authuser=6&hl=ar)
آلية العمل
يستخدم هذا الحلّ قائمة مخصّصة في "جداول بيانات Google" لتنفيذ عملية إنشاء
نظام تسجيل الأحداث هذا. ينشئ النص البرمجي تقويمًا مع مكالمة الفيديو
الأحداث المدرجة في جدول بيانات جداول البيانات. بعد ذلك، ينشئ البرنامج النصي
نموذجًا يحتوي على قائمة الأحداث التي يمكن للحاضرين الاشتراك فيها. بعد الحضور
سيملأ النموذج، ويضيف البرنامج النصي الحاضرين إلى أحداث التقويم
رسائل البريد الإلكتروني لبرامج الرحلات إليها.
خدمات برمجة التطبيقات
يستخدم هذا الحلّ الخدمات التالية:
- خدمة جدول البيانات: توفر هذه الخدمة
ومعلومات الحدث إلى الخدمات الأخرى.
- خدمة "تقويم Google": تنشئ
تقويم جديد للحدث، وإضافة الأحداث إلى التقويم، وإضافة ضيوف
إلى الفعاليات التي يشتركون فيها
- خدمة المواقع: تخزِّن خدمة "مواقع Google"
معرّف التقويم الذي تم إنشاؤه بواسطة خدمة التقويم. عندما يختار المستخدم
انقر على إعداد مكالمة الفيديو من قائمة مكالمة الفيديو المخصّصة،
تتحقّق خدمة المواقع مما إذا كان نظام تسجيل الحدث قد سبق وبدأ
عن طريق التحقق من وجود خاصية معرّف التقويم. يساعد ذلك في تحسين طريقة أداء موقعك الإلكتروني.
تجنب إنشاء نماذج وتقاويم مكرّرة.
- خدمة "نماذج Google": إنشاء نموذج
من المعلومات الموجودة في جدول البيانات والتي تتيح للحاضرين الاشتراك
الجلسات.
- خدمة النص البرمجي: تنشئ مشغِّلاً يتم تنشيطه.
عندما يملأ أحد الضيوف النموذج.
- خدمة المستندات: للحصول على الحدث
حول الأحداث التي يشترك فيها الضيف ويضيف قائمة
الأحداث إلى مستند جديد. يمنح النص البرمجي للضيف إذنًا لتعديل
المستند.
- خدمة البريد: لإرسال مستند برنامج الرحلة بالبريد الإلكتروني إلى
للضيف.
المتطلبات الأساسية
لاستخدام هذا النموذج، تحتاج إلى المتطلبات الأساسية التالية:
- حساب Google (قد يكون لدى حسابات Google Workspace
طلب موافقة المشرف).
- متصفح ويب متصل بالإنترنت.
إعداد النص البرمجي
- انقر على الزر التالي لإنشاء نسخة من الزر إنشاء اشتراك في
جلسات في مؤتمر نموذج جدول بيانات. برمجة التطبيقات
الخاص بمشروع هذا الحل بجدول البيانات.
إنشاء نسخة
- انقر على مكالمة فيديو > الإعداد
المؤتمر. قد تحتاج إلى إعادة تحميل الصفحة لهذه القائمة المخصصة
موضع الإعلان.
امنح الإذن للنص البرمجي عندما يُطلب منك ذلك.
إذا عرضت شاشة موافقة OAuth التحذير، لم يتم التحقق من هذا التطبيق،
المتابعة من خلال اختيار إعدادات متقدّمة >
انتقِل إلى {Project Name} (غير آمن).
انقر على مكالمة فيديو > الإعداد
مرة أخرى.
تشغيل النص البرمجي
- انقر على أدوات > إدارة النموذج.
> الانتقال إلى النموذج المباشر.
- املأ النموذج وأرسِله.
- انتقِل إلى calendar.google.com.
- على يمين الصفحة، تأكَّد من وضع علامة في المربّع بجانب تقويم المؤتمرات.
- الانتقال إلى تواريخ الأحداث التي اشتركت فيها وتأكيد إضافتك
كضيف.
(اختياري) إعادة ضبط الحلّ
إذا أردت تجربة هذا الحل من جديد، أو تخصيصه لاستخدامه
معلومات الأحداث الخاصة بك، فستحتاج إلى إعادة ضبط بعض العناصر التي تم إعدادها
عند تشغيل النص لأول مرة. لعرض خطوات إعادة ضبط الحلّ، انقر على
إعادة ضبط الحلّ أدناه:
إعادة ضبط الحلّ
الخطوة 1: إعادة ضبط خصائص النص البرمجي المخزَّنة
إذا حاولت تشغيل النص البرمجي أكثر من مرة، سيُطلب منك
في اجتماع الفيديو بالفعل. ابحث في Google Drive عن نموذج الاشتراك.
يحدث ذلك لأنه بمجرد إنشاء "تقويم المؤتمرات"، معرِّف التقويم
كخاصية نص برمجي. عند تشغيل النص البرمجي، يتحقق مما إذا كان
خاصية معرِّف التقويم موجودة مسبقًا، وسيتوقف تشغيلها إذا كان الأمر كذلك.
اتّبِع الخطوات التالية لإزالة خاصية رقم تعريف التقويم الحالي:
- في جدول البيانات، انقر على الإضافات.
> برمجة التطبيقات.
- في محرِّر "برمجة تطبيقات Google"، اختَر
resetProperties
من
القائمة المنسدلة للدوال والنقر على تشغيل.
الخطوة 2: حذف "تقويم مكالمة الفيديو"
في كل مرة يتم فيها تشغيل النص البرمجي، يتم إنشاء تقويم جديد. إذا كنت لا تريد
للاحتفاظ بالتقويم الأصلي الذي تم إنشاؤه، اتبع الخطوات التالية:
- انتقِل إلى calendar.google.com.
- بجانب "تقويم المؤتمرات"، انقر على "الخيارات المتاحة لتقويم مكالمات الفيديو".
>
الإعدادات والمشاركة:
- انتقِل إلى أسفل الإعدادات وانقر على حذف.
ينشئ النص البرمجي مشغلاً لعمليات إرسال النماذج في كل مرة تقوم فيها بتشغيله. إلى
تجنب العوامل المتعددة التي تؤدي إلى تكرار الرسائل الإلكترونية، أزِل الرسالة الأصلية
. اتبع الخطوات التالية:
- في جدول البيانات، انقر على الإضافات.
> برمجة التطبيقات.
- في مشروع "برمجة التطبيقات"، انقر على العوامل المشغِّلة على يمين الصفحة.
![](https://fonts.gstatic.com/s/i/short-term/release/googlesymbols/alarm/default/24px.svg)
- بجانب العامل المشغِّل، انقر على رمز المزيد
.
> حذف المشغِّل.
في كل مرة تقوم فيها بتشغيل النص البرمجي، يتم إنشاء نموذج جديد. اتّبِع الخطوات التالية
قم بإلغاء ربط النموذج بجدول البيانات وحذفه:
- في جدول البيانات، انقر بزر الماوس الأيمن على ورقة ردود النموذج وانقر على
إلغاء ربط النموذج > حسنًا.
- انقر بزر الماوس الأيمن على ورقة الردود على النموذج مرة أخرى وانقر على حذف.
> حسنًا.
- انتقِل إلى forms.google.com.
- انقر بزر الماوس الأيمن على نموذج المؤتمر وانقر على إزالة.
> نقل إلى المهملات.
بعد إعادة ضبط الحلّ، يمكنك إضافة بياناتك الخاصة أو المتابعة
واستخدام نموذج البيانات، وتشغيل البرنامج النصي مرة أخرى.
مراجعة الرمز البرمجي
لمراجعة رمز "برمجة تطبيقات Google" لهذا الحلّ، انقر على
عرض رمز المصدر أدناه:
عرض رمز المصدر
Code.gs
// 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.
الخطوات التالية