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

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

ข้อจำกัด

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

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

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

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

  • ทริกเกอร์ที่ติดตั้งได้อยู่ภายใต้ขีดจํากัดโควต้าของทริกเกอร์ Apps Script

ทริกเกอร์ที่ทำงานตามเวลา

ทริกเกอร์ที่ทำงานตามเวลา (หรือที่เรียกว่าทริกเกอร์นาฬิกา) จะคล้ายกับงาน cron ใน Unix ทริกเกอร์ที่ทำงานตามเวลาช่วยให้สคริปต์ทำงานในเวลาที่เจาะจงหรือในช่วงเวลาที่ซ้ำกัน ไม่ว่าจะเป็นทุกนาทีหรือเดือนละครั้ง (โปรดทราบว่าส่วนเสริมสามารถใช้ทริกเกอร์ที่ทำงานตามเวลาได้สูงสุด 1 ครั้งต่อชั่วโมง) ระบบอาจสุ่มเวลาเล็กน้อย เช่น หากคุณสร้างทริกเกอร์ที่เกิดซ้ำเวลา 09:00 น. Apps Script จะเลือกเวลาระหว่าง 09: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() ธรรมดา อย่างไรก็ตาม เวอร์ชันที่ติดตั้งได้สามารถเรียกใช้บริการที่ต้องใช้การให้สิทธิ์ เวอร์ชันที่ติดตั้งได้จะทำงานด้วยการให้สิทธิ์ของผู้ใช้ที่สร้างทริกเกอร์ แม้ว่าผู้ใช้รายอื่นที่มีสิทธิ์แก้ไขจะเปิดสเปรดชีตก็ตาม

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

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

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

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

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

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

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

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

ตัวอย่างต่อไปนี้แสดงวิธีสร้างทริกเกอร์ที่ทำงานตามเวลา 2 รายการ ได้แก่ 1 รายการที่ทำงานทุก 6 ชั่วโมง และอีก 1 รายการที่ทำงานทุกวันจันทร์เวลา 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