ทริกเกอร์ที่ติดตั้งได้

เช่นเดียวกับทริกเกอร์ทั่วไป ทริกเกอร์ที่ติดตั้งได้ช่วยให้ Apps Script เรียกใช้ฟังก์ชันโดยอัตโนมัติเมื่อมีเหตุการณ์บางอย่างเกิดขึ้น เช่น การเปิดเอกสาร อย่างไรก็ตาม ทริกเกอร์ที่ติดตั้งได้จะให้ความยืดหยุ่นมากกว่าทริกเกอร์ทั่วไป โดยทริกเกอร์บริการที่ต้องมีการให้สิทธิ์ได้ โดยจะเสนอเหตุการณ์เพิ่มเติมหลายประเภท รวมถึงทริกเกอร์ที่ขึ้นกับเวลา (นาฬิกา) และสามารถควบคุมแบบเป็นโปรแกรมได้ สำหรับทั้งทริกเกอร์แบบง่ายและทริกเกอร์ที่ติดตั้งได้ Apps Script จะส่งฟังก์ชันที่ทริกเกอร์ออบเจ็กต์เหตุการณ์ซึ่งมีข้อมูลเกี่ยวกับบริบทที่เกิดเหตุการณ์

ข้อจำกัด

แม้ว่าทริกเกอร์ที่ติดตั้งได้จะให้ความยืดหยุ่นมากกว่าทริกเกอร์ทั่วไป แต่ก็ยังคงอยู่ภายใต้ข้อจำกัดหลายประการ ดังนี้

  • โดยจะไม่ทำงานหากเปิดไฟล์ในโหมดอ่านอย่างเดียว (ดูหรือแสดงความคิดเห็น) สำหรับสคริปต์แบบสแตนด์อโลน ผู้ใช้ต้องมีสิทธิ์ดูไฟล์สคริปต์เป็นอย่างน้อยเพื่อให้ทริกเกอร์ทำงานได้อย่างถูกต้อง
  • การเรียกใช้สคริปต์และคำขอ API จะไม่ทำให้ทริกเกอร์ทำงาน ตัวอย่างเช่น การเรียก FormResponse.submit() เพื่อส่งการตอบกลับแบบฟอร์มใหม่จะไม่ทำให้ทริกเกอร์การส่งแบบฟอร์มทำงาน

  • ทริกเกอร์ที่ติดตั้งได้จะทำงานในบัญชีของผู้ที่สร้างทริกเกอร์นั้นเสมอ ตัวอย่างเช่น ถ้าคุณสร้างทริกเกอร์เปิดที่ติดตั้งได้ ทริกเกอร์นี้จะทำงานเมื่อเพื่อนร่วมงานเปิดเอกสาร (หากเพื่อนร่วมงานมีสิทธิ์แก้ไข) แต่ทริกเกอร์นี้ทำงานเป็นบัญชีของคุณ ซึ่งหมายความว่าหากคุณสร้างทริกเกอร์ให้ส่งอีเมลเมื่อมีการเปิดเอกสาร อีเมลจะส่งมาจากบัญชีของคุณเสมอ ไม่จำเป็นต้องเป็นบัญชีที่เปิดเอกสาร อย่างไรก็ตาม คุณสร้างทริกเกอร์ที่ติดตั้งได้สำหรับแต่ละบัญชีได้ ซึ่งจะส่งผลให้มีการส่งอีเมล 1 ฉบับจากแต่ละบัญชี

  • บัญชีหนึ่งๆ จะไม่เห็นทริกเกอร์ที่ติดตั้งจากบัญชีที่ 2 แม้ว่าบัญชีแรกจะยังเปิดใช้งานทริกเกอร์เหล่านั้นได้

  • ทริกเกอร์ที่ติดตั้งได้จะขึ้นอยู่กับขีดจำกัดโควต้าของทริกเกอร์ Apps Script

ทริกเกอร์ที่ขึ้นอยู่กับเวลา

ทริกเกอร์ที่ขึ้นอยู่กับเวลา (เรียกอีกอย่างว่าทริกเกอร์นาฬิกา) คล้ายกับงาน cron ใน Unix ทริกเกอร์ที่ขึ้นอยู่กับเวลาให้สคริปต์ทำงานในเวลาที่กำหนดหรือในช่วงเวลาที่เกิดซ้ำบ่อยเท่าใดก็ได้ทุกนาที หรือไม่บ่อยเท่า 1 ครั้งต่อเดือน (โปรดทราบว่าส่วนเสริมใช้ทริกเกอร์ที่ขึ้นอยู่กับเวลาได้สูงสุด 1 ครั้งต่อชั่วโมง) เวลาอาจสุ่มเล็กน้อย เช่น หากคุณสร้างทริกเกอร์ที่เกิดซ้ำ 9:00 น. Apps Script จะเลือกเวลาระหว่าง 9.00 น. - 10.00 น. จากนั้นจะคงช่วงเวลาดังกล่าวให้สอดคล้องกันในแต่ละวัน เพื่อให้ผ่านไป 24 ชั่วโมงก่อนที่ทริกเกอร์จะเริ่มทำงานอีกครั้ง

ต่อไปนี้คือตัวอย่างของแอป Google Chat ที่โพสต์ข้อความทุกๆ นาทีไปยังทุกพื้นที่ทำงานที่มีแอปนั้น

// Example app for Google Chat that demonstrates app-initiated messages
// by spamming the user every minute.
//
// This app makes use of the Apps Script OAuth2 library at:
//     https://github.com/googlesamples/apps-script-oauth2
//
// Follow the instructions there to add the library to your script.

// When added to a space, we store the space's ID in ScriptProperties.
function onAddToSpace(e) {
  PropertiesService.getScriptProperties()
      .setProperty(e.space.name, '');
  return {
    'text': 'Hi! I\'ll post a message here every minute. ' +
            'Please remove me after testing or I\'ll keep spamming you!'
  };
}

// When removed from a space, we remove the space's ID from ScriptProperties.
function onRemoveFromSpace(e) {
  PropertiesService.getScriptProperties()
      .deleteProperty(e.space.name);
}

// Add a trigger that invokes this function every minute in the
// "Edit > Current Project's Triggers" menu. When it runs, it
// posts in each space the app was added to.
function onTrigger() {
  var spaceIds = PropertiesService.getScriptProperties()
      .getKeys();
  var message = { 'text': 'Hi! It\'s now ' + (new Date()) };
  for (var i = 0; i < spaceIds.length; ++i) {
    postMessage(spaceIds[i], message);
  }
}
var SCOPE = 'https://www.googleapis.com/auth/chat.bot';
// The values below are copied from the JSON file downloaded upon
// service account creation.
// For SERVICE_ACCOUNT_PRIVATE_KEY, remember to include the BEGIN and END lines
// of the private key
var SERVICE_ACCOUNT_PRIVATE_KEY = '...';
var SERVICE_ACCOUNT_EMAIL = 'service-account@project-id.iam.gserviceaccount.com';

// Posts a message into the given space ID via the API, using
// service account authentication.
function postMessage(spaceId, message) {
  var service = OAuth2.createService('chat')
      .setTokenUrl('https://accounts.google.com/o/oauth2/token')
      .setPrivateKey(SERVICE_ACCOUNT_PRIVATE_KEY)
      .setClientId(SERVICE_ACCOUNT_EMAIL)
      .setPropertyStore(PropertiesService.getUserProperties())
      .setScope(SCOPE);
  if (!service.hasAccess()) {
    Logger.log('Authentication error: %s', service.getLastError());
    return;
  }
  var url = 'https://chat.googleapis.com/v1/' + spaceId + '/messages';
  UrlFetchApp.fetch(url, {
    method: 'post',
    headers: { 'Authorization': 'Bearer ' + service.getAccessToken() },
    contentType: 'application/json',
    payload: JSON.stringify(message),
  });
}

ทริกเกอร์ที่ขับเคลื่อนด้วยเหตุการณ์

ทริกเกอร์ที่ขับเคลื่อนด้วยเหตุการณ์ที่ติดตั้งได้นั้นมีลักษณะแนวคิดคล้ายกับทริกเกอร์ทั่วไป เช่น onOpen() แต่ก็ตอบสนองต่อเหตุการณ์เพิ่มเติมได้และจะทำงานต่างกันได้

เช่น ทริกเกอร์เปิดที่ติดตั้งได้สำหรับ Google ชีตจะเปิดใช้งานเมื่อใดก็ตามที่ผู้ใช้ที่มีสิทธิ์แก้ไขเปิดสเปรดชีตนี้ เช่นเดียวกับทริกเกอร์ onOpen() แบบง่าย แต่เวอร์ชันที่ติดตั้งได้จะเรียกใช้บริการที่ต้องมีการให้สิทธิ์ได้ เวอร์ชันที่ติดตั้งได้จะทำงานโดยการให้สิทธิ์จากผู้ใช้ที่สร้างทริกเกอร์ แม้ว่าผู้ใช้รายอื่นที่มีสิทธิ์แก้ไขจะเปิดสเปรดชีตนั้นก็ตาม

มีทริกเกอร์ที่ติดตั้งได้สำหรับแอปพลิเคชันGoogle Workspace หลายรายการ ดังนี้

  • ทริกเกอร์เปิดที่ติดตั้งได้จะทำงานเมื่อผู้ใช้เปิดสเปรดชีต เอกสาร หรือแบบฟอร์มที่ผู้ใช้มีสิทธิ์แก้ไข
  • ทริกเกอร์แก้ไขที่ติดตั้งได้จะทำงานเมื่อผู้ใช้แก้ไขค่าในสเปรดชีต
  • ทริกเกอร์การเปลี่ยนแปลงที่ติดตั้งได้จะทำงานเมื่อผู้ใช้แก้ไขโครงสร้างของสเปรดชีต เช่น โดยการเพิ่มชีตใหม่หรือนำคอลัมน์ออก
  • ทริกเกอร์การส่งแบบฟอร์มที่ติดตั้งได้จะทำงานเมื่อผู้ใช้ตอบกลับแบบฟอร์ม ทริกเกอร์การส่งแบบฟอร์มมี 2 เวอร์ชัน ได้แก่ เวอร์ชันสำหรับ Google ฟอร์มเอง และเวอร์ชันหนึ่งสำหรับชีตหากส่งแบบฟอร์มไปยังสเปรดชีต
  • ทริกเกอร์กิจกรรมในปฏิทินที่ติดตั้งได้จะทำงานเมื่อมีการอัปเดตกิจกรรมในปฏิทินของผู้ใช้ เช่น สร้าง แก้ไข หรือลบ

คุณสามารถใช้ทริกเกอร์ที่ติดตั้งได้ในสคริปต์แบบสแตนด์อโลนและสคริปต์ที่เชื่อมโยง เช่น สคริปต์แบบสแตนด์อโลนสามารถสร้างทริกเกอร์ที่ติดตั้งได้แบบเป็นโปรแกรมสำหรับไฟล์ Google ชีตที่กําหนดเองโดยการเรียกใช้ TriggerBuilder.forSpreadsheet(key) แล้วส่งผ่านรหัสของสเปรดชีต

จัดการทริกเกอร์ด้วยตนเอง

หากต้องการสร้างทริกเกอร์ที่ติดตั้งได้ในเครื่องมือแก้ไขสคริปต์ด้วยตนเอง ให้ทำตามขั้นตอนต่อไปนี้

  1. เปิดโปรเจ็กต์ Apps Script
  2. คลิกทริกเกอร์ ทางด้านซ้าย
  3. คลิกเพิ่มทริกเกอร์ที่ด้านขวาล่าง
  4. เลือกและกำหนดค่าประเภททริกเกอร์ที่ต้องการสร้าง
  5. คลิกบันทึก

จัดการทริกเกอร์แบบเป็นโปรแกรม

คุณยังสร้างและลบทริกเกอร์แบบเป็นโปรแกรมได้ด้วยบริการสคริปต์ เริ่มด้วยการเรียกใช้ ScriptApp.newTrigger(functionName) ซึ่งแสดงผล TriggerBuilder

ตัวอย่างต่อไปนี้แสดงวิธีสร้างทริกเกอร์ที่ขับเคลื่อนด้วยเวลา 2 รายการ โดยตัวทริกเกอร์หนึ่งเริ่มทำงานทุก 6 ชั่วโมง อีกตัวที่จะเริ่มทำงานทุกวันจันทร์เวลา 9.00 น. (ในเขตเวลาที่สคริปต์ตั้งค่าไว้)

triggers/triggers.gs
/**
 * Creates two time-driven triggers.
 * @see https://developers.google.com/apps-script/guides/triggers/installable#time-driven_triggers
 */
function createTimeDrivenTriggers() {
  // Trigger every 6 hours.
  ScriptApp.newTrigger('myFunction')
      .timeBased()
      .everyHours(6)
      .create();
  // Trigger every Monday at 09:00.
  ScriptApp.newTrigger('myFunction')
      .timeBased()
      .onWeekDay(ScriptApp.WeekDay.MONDAY)
      .atHour(9)
      .create();
}

ตัวอย่างต่อไปนี้แสดงวิธีสร้างทริกเกอร์เปิดที่ติดตั้งได้สำหรับสเปรดชีต โปรดทราบว่าสคริปต์สำหรับทริกเกอร์ที่ติดตั้งได้ไม่จำเป็นต้องเชื่อมโยงกับสเปรดชีต ซึ่งต่างจากทริกเกอร์ onOpen() ทั่วไป หากต้องการสร้างทริกเกอร์นี้จากสคริปต์แบบสแตนด์อโลน ให้แทนที่ SpreadsheetApp.getActive() ด้วยการเรียกใช้ SpreadsheetApp.openById(id)

triggers/triggers.gs
/**
 * Creates a trigger for when a spreadsheet opens.
 * @see https://developers.google.com/apps-script/guides/triggers/installable
 */
function createSpreadsheetOpenTrigger() {
  const ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('myFunction')
      .forSpreadsheet(ss)
      .onOpen()
      .create();
}

หากต้องการแก้ไขทริกเกอร์ที่ติดตั้งได้ซึ่งมีอยู่แล้วแบบเป็นโปรแกรม คุณต้องลบทริกเกอร์ดังกล่าวออกแล้วจึงสร้างทริกเกอร์ใหม่ หากก่อนหน้านี้คุณได้จัดเก็บรหัสของทริกเกอร์ไว้ คุณสามารถลบรหัสได้โดยส่งต่อรหัสเป็นอาร์กิวเมนต์ไปยังฟังก์ชันด้านล่าง

triggers/triggers.gs
/**
 * Deletes a trigger.
 * @param {string} triggerId The Trigger ID.
 * @see https://developers.google.com/apps-script/guides/triggers/installable
 */
function deleteTrigger(triggerId) {
  // Loop over all triggers.
  const allTriggers = ScriptApp.getProjectTriggers();
  for (let index = 0; index < allTriggers.length; index++) {
    // If the current trigger is the correct one, delete it.
    if (allTriggers[index].getUniqueId() === triggerId) {
      ScriptApp.deleteTrigger(allTriggers[index]);
      break;
    }
  }
}

ข้อผิดพลาดในตัวทริกเกอร์

เมื่อทริกเกอร์ที่ติดตั้งได้เริ่มทำงานแต่ฟังก์ชันดังกล่าวทำให้เกิดข้อยกเว้นหรือหากเรียกใช้ไม่สำเร็จ คุณจะไม่เห็นข้อความแสดงข้อผิดพลาดบนหน้าจอ เพราะเมื่อทริกเกอร์แบบใช้เวลาทำงานแล้ว หรือผู้ใช้รายอื่นเปิดใช้งานทริกเกอร์การส่งแบบฟอร์มของคุณ คุณอาจไม่ได้อยู่หน้าคอมพิวเตอร์ด้วยซ้ำ

แต่ Apps Script จะส่งอีเมลต่อไปนี้ให้คุณแทน

From: noreply-apps-scripts-notifications@google.com
Subject: Summary of failures for Google Apps Script
Your script has recently failed to finish successfully.
A summary of the failure(s) is shown below.

โดยในอีเมลจะมีลิงก์สำหรับปิดใช้งานหรือกำหนดค่าทริกเกอร์ใหม่ หากเชื่อมโยงสคริปต์กับไฟล์ Google ชีต เอกสาร หรือฟอร์ม อีเมลจะมีลิงก์ไปยังไฟล์นั้นด้วย ลิงก์เหล่านี้ให้คุณปิดใช้งานทริกเกอร์หรือแก้ไขสคริปต์เพื่อแก้ไขข้อบกพร่อง

หากต้องการตรวจสอบทริกเกอร์ทั้งหมดที่เชื่อมโยงกับบัญชี Google และปิดใช้งานทริกเกอร์ที่คุณไม่ใช้แล้ว ให้ทำตามขั้นตอนต่อไปนี้

  1. ไปที่ script.google.com
  2. คลิกทริกเกอร์ของฉันทางด้านซ้าย
  3. หากต้องการลบทริกเกอร์ ให้คลิกเพิ่มเติม > ลบทริกเกอร์ ที่ด้านขวาของทริกเกอร์

ทริกเกอร์ในส่วนเสริม

นอกเหนือจากทริกเกอร์ที่ติดตั้งได้ คุณสามารถใช้ทริกเกอร์ไฟล์ Manifest ในส่วนเสริมได้ด้วย ดูข้อมูลเพิ่มเติมได้ที่ทริกเกอร์สำหรับส่วนเสริม Google Workspace