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

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

ข้อจำกัด

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

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

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

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

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

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

ทริกเกอร์ตามเวลา (หรือที่เรียกว่าทริกเกอร์นาฬิกา) คล้ายกับงาน cron ใน Unix ทริกเกอร์ที่ขึ้นอยู่กับเวลาทำให้สคริปต์ทำงานที่เวลาใดเวลาหนึ่งหรือในช่วงเวลาที่เกิดซ้ำ เหมือนทุกนาทีหรือนานๆ ครั้งต่อเดือน (โปรดทราบว่าส่วนเสริมจะใช้ทริกเกอร์ที่ขึ้นกับเวลาได้สูงสุด 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();
}

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

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. หากต้องการลบทริกเกอร์ ให้คลิกเพิ่มเติม > ลบทริกเกอร์ที่ด้านขวาของทริกเกอร์

ทริกเกอร์ที่ติดตั้งได้ในส่วนเสริม

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ทริกเกอร์ที่ติดตั้งได้ในส่วนเสริมได้ที่ทริกเกอร์ส่วนเสริม