การให้สิทธิ์ส่วนเสริมของ Editor

การให้สิทธิ์สำหรับแอปจำนวนมากที่ใช้ Apps Script นั้นตรงไปตรงมา เนื่องจากโปรเจ็กต์สคริปต์จะขอสิทธิ์ที่ขาดหายไปเมื่อมีคนพยายามใช้

รูปแบบการให้สิทธิ์สำหรับส่วนเสริมของเอดิเตอร์มีความซับซ้อนมากกว่าด้วยเหตุผลหลายประการดังนี้

  • เมื่อผู้ใช้สร้างไฟล์ ส่วนเสริมทั้งหมดที่ผู้ใช้ติดตั้งจะแสดงในเมนูส่วนขยาย แม้ว่าผู้ใช้จะยังไม่ได้ให้สิทธิ์ส่วนเสริมเหล่านั้นก็ตาม

  • ส่วนเสริมเหล่านี้จะทำงานกับไฟล์ใน Google ไดรฟ์ที่แชร์กับผู้ทำงานร่วมกันได้ ผู้ทำงานร่วมกันที่ไม่ได้ติดตั้งส่วนเสริมเอดิเตอร์จะเห็นส่วนเสริมนี้ในเอกสารที่ผู้สร้างไฟล์ใช้ส่วนเสริมนี้

  • ส่วนเสริมของเอดิเตอร์จะเรียกใช้onOpen() ฟังก์ชันโดยอัตโนมัติเมื่อเปิดเอกสาร

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

รูปแบบการให้สิทธิ์

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

สถานะของส่วนเสริมของเอดิเตอร์

ส่วนเสริมของเอดิเตอร์ในเมนูส่วนขยายจะ ติดตั้ง เปิดใช้ หรือทั้ง 2 อย่าง

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

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

ติดตั้งแล้ว เปิดใช้
ใช้กับ ผู้ใช้ เอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีต
เกิดจาก การรับส่วนเสริมจากร้านค้า การรับส่วนเสริมจากร้านค้าขณะใช้เอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีตนั้น หรือ
การใช้ส่วนเสริมที่ติดตั้งไว้ก่อนหน้านี้ในเอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีตนั้น
เมนูที่มองเห็นได้ เฉพาะผู้ใช้รายนั้นในเอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีตทั้งหมดที่ผู้ใช้เปิดหรือสร้าง ผู้ทำงานร่วมกันทุกคนในเอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีตนั้น
โหมดการให้สิทธิ์สำหรับ onOpen() AuthMode.NONE
(เว้นแต่จะเปิดใช้ด้วย ในกรณีนี้ AuthMode.LIMITED)
AuthMode.LIMITED

โหมดการให้สิทธิ์

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

หากเปิดใช้ส่วนเสริมของเอดิเตอร์ในไฟล์ แบบฟอร์ม งานนำเสนอ หรือสเปรดชีต onOpen() จะทำงานใน AuthMode.LIMITED หากไม่ได้เปิดใช้ส่วนเสริมและติดตั้งเท่านั้น onOpen() จะทำงานใน AuthMode.NONE

ใน AuthMode.NONE ส่วนเสริมจะเรียกใช้บริการบางอย่างไม่ได้จนกว่าผู้ใช้จะโต้ตอบกับส่วนเสริมโดยการคลิกหรือเรียกใช้ฟังก์ชันที่กำหนดเอง หากส่วนเสริมพยายามใช้บริการเหล่านี้ในขอบเขต onOpen(), onInstall() หรือขอบเขตส่วนกลาง สิทธิ์จะล้มเหลวและระบบจะหยุดการเรียกอื่นๆ เช่น การป้อนข้อมูลในเมนู โดยมีเพียงตัวเลือกความช่วยเหลือเท่านั้นที่รองรับ

หากต้องการเรียกใช้บริการที่จำกัด คุณต้องใช้โหมดการให้สิทธิ์ AuthMode.FULL ฟังก์ชันการโต้ตอบของผู้ใช้ เช่น การคลิกตัวเลือกเมนู จะทํางานในโหมดนี้เท่านั้น หลังจากเรียกใช้โค้ดในโหมด AuthMode.FULL แล้ว ส่วนเสริมจะใช้ขอบเขตทั้งหมดที่ผู้ใช้ให้สิทธิ์ได้

Apps Script จะส่งโหมดการให้สิทธิ์ เป็นพร็อพเพอร์ตี้ authMode ของ Apps Script พารามิเตอร์เหตุการณ์ e ค่าของ e.authMode จะสอดคล้องกับค่าคงที่ใน enum ScriptApp.AuthMode ของ Apps Script

โหมดการให้สิทธิ์ใช้ได้กับวิธีการเรียกใช้ Apps Script ทั้งหมด รวมถึงการเรียกใช้จากเครื่องมือแก้ไขสคริปต์ จากรายการเมนู หรือจากการเรียกใช้ Apps Script google.script.run อย่างไรก็ตาม คุณจะตรวจสอบพร็อพเพอร์ตี้ e.authMode ได้ก็ต่อเมื่อสคริปต์ทำงานเป็นผลลัพธ์ของทริกเกอร์ เช่น onOpen(), onEdit() หรือ onInstall() ฟังก์ชันที่กำหนดเอง ใน Google ชีตจะใช้โหมดการให้สิทธิ์ของตัวเอง AuthMode.CUSTOM_FUNCTION ซึ่งคล้ายกับ LIMITED แต่มีข้อจำกัดที่แตกต่างกันเล็กน้อย สำหรับกรณีอื่นๆ ทั้งหมด สคริปต์จะทำงานใน AuthMode.FULL ตามที่อธิบายไว้ในตารางต่อไปนี้

NONE LIMITED CUSTOM_FUNCTION FULL
เกิดขึ้นสำหรับ onOpen() (หากผู้ใช้ติดตั้งส่วนเสริมแล้วแต่ไม่ได้เปิดใช้ในเอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีต) onOpen() (เวลาอื่นๆ ทั้งหมด)
onEdit() (ในชีตเท่านั้น)
ฟังก์ชันที่กำหนดเอง ในเวลาอื่นๆ ทั้งหมด ซึ่งรวมถึง
ทริกเกอร์ที่ติดตั้งได้
onInstall()
google.script.run
การเข้าถึงข้อมูลผู้ใช้ เฉพาะภาษา เฉพาะภาษา เฉพาะภาษา ใช่
สิทธิ์เข้าถึงเอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีต ไม่ ใช่ ได้ — อ่านอย่างเดียว ใช่
การเข้าถึงอินเทอร์เฟซผู้ใช้ เพิ่มรายการในเมนู เพิ่มรายการในเมนู ไม่ ใช่
สิทธิ์เข้าถึง Properties ไม่ ได้ ได้ ใช่
สิทธิ์เข้าถึง Jdbc, UrlFetch ไม่ ไม่ได้ ได้ ใช่
บริการอื่นๆ Logger
Utilities
บริการใดก็ตามที่ไม่ได้เข้าถึงข้อมูลผู้ใช้ บริการใดก็ตามที่ไม่ได้เข้าถึงข้อมูลผู้ใช้ บริการทั้งหมด

วงจรการให้สิทธิ์ของส่วนเสริมของเอดิเตอร์

เมื่อติดตั้งส่วนเสริมสำหรับผู้ใช้ปัจจุบัน หรือเปิดใช้ในไฟล์ปัจจุบัน ระบบจะโหลดส่วนเสริมสำหรับเอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีตเมื่อเปิดไฟล์นั้น ส่วนเสริมจะแสดงในเมนูส่วนขยายและเริ่มรอทริกเกอร์อย่างง่าย onInstall(), onOpen() และ onEdit() หากผู้ใช้คลิกรายการเมนูส่วนขยาย ระบบจะเรียกใช้

ติดตั้งส่วนเสริมของเอดิเตอร์แล้ว

เมื่อติดตั้งส่วนเสริมของโปรแกรมแก้ไขจากร้านค้า ฟังก์ชันของส่วนเสริมจะทำงานใน AuthMode.FULLonInstall() ในโหมดการให้สิทธิ์นี้ ส่วนเสริมจะเรียกใช้กิจวัตรการตั้งค่าที่ซับซ้อนได้ นอกจากนี้ คุณยังควรใช้ onInstall() เพื่อสร้างรายการเมนู เนื่องจากเอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีตเปิดอยู่แล้วและฟังก์ชัน onOpen() ยังไม่ได้ทำงาน ตัวอย่างต่อไปนี้แสดงวิธีเรียกใช้ฟังก์ชัน onOpen() จากฟังก์ชัน onInstall()

function onInstall(e) {
  onOpen(e);
  // Perform additional setup as needed.
}

ระบบจะเปิดส่วนเสริมของเอดิเตอร์

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

หากส่วนเสริมสร้างเฉพาะเมนูพื้นฐาน โหมด ก็ไม่สำคัญ ตัวอย่างต่อไปนี้แสดงonOpen()ฟังก์ชันพื้นฐาน

function onOpen(e) {
  SpreadsheetApp.getUi().createAddonMenu() // Or DocumentApp.
      .addItem('Insert chart', 'insertChart')
      .addItem('Update charts', 'updateCharts')
      .addToUi();
}

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

ตัวอย่างต่อไปนี้แสดงonOpen()ฟังก์ชันขั้นสูงที่เปลี่ยนการดำเนินการ ตามโหมดการให้สิทธิ์

function onOpen(e) {
  var menu = SpreadsheetApp.getUi().createAddonMenu(); // Or DocumentApp.
  if (e && e.authMode == ScriptApp.AuthMode.NONE) {
    // Add a normal menu item (works in all authorization modes).
    menu.addItem('Start workflow', 'startWorkflow');
  } else {
    // Add a menu item based on properties (doesn't work in AuthMode.NONE).
    var properties = PropertiesService.getDocumentProperties();
    var workflowStarted = properties.getProperty('workflowStarted');
    if (workflowStarted) {
      menu.addItem('Check workflow status', 'checkWorkflow');
    } else {
      menu.addItem('Start workflow', 'startWorkflow');
    }
  }
  menu.addToUi();
}

โปรดทราบว่าส่วนเสริมไม่สามารถเปิดแถบด้านข้างหรือกล่องโต้ตอบขณะดำเนินการใน AuthMode.LIMITED คุณสามารถใช้รายการเมนู เพื่อเปิดแถบด้านข้างและกล่องโต้ตอบได้ เนื่องจากรายการเหล่านี้ทำงานใน AuthMode.FULL

ผู้ใช้เรียกใช้ส่วนเสริมของเอดิเตอร์

เมื่อผู้ใช้คลิกรายการเมนูส่วนขยาย Apps Script จะตรวจสอบก่อนว่าผู้ใช้ได้ติดตั้ง ส่วนเสริมแล้วหรือไม่ และ แจ้งให้ผู้ใช้ติดตั้งหากยังไม่ได้ติดตั้ง หากผู้ใช้ให้สิทธิ์ ส่วนเสริม สคริปต์จะเรียกใช้ฟังก์ชันที่ สอดคล้องกับรายการเมนูใน AuthMode.FULL ระบบจะเปิดใช้ ส่วนเสริมในเอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีต หากยังไม่ได้เปิดใช้

แก้ปัญหาเมนูส่วนเสริมไม่แสดง

เมนูส่วนเสริมอาจไม่แสดงผลหากโค้ด จัดการโหมดการให้สิทธิ์ไม่ถูกต้อง เช่น

  • ส่วนเสริมพยายามเรียกใช้บริการ Apps Script ที่โหมดการให้สิทธิ์ปัจจุบันไม่รองรับ

  • ส่วนเสริมพยายามเรียกใช้บริการก่อนที่ผู้ใช้จะโต้ตอบกับส่วนเสริม

หากต้องการนำออกหรือจัดเรียงการเรียกใช้บริการที่ทำให้เกิดข้อผิดพลาดเกี่ยวกับสิทธิ์ใน AuthMode.NONE ให้ลองทำดังนี้

  1. เปิดโปรเจ็กต์ Apps Script สำหรับส่วนเสริม แล้วค้นหาฟังก์ชัน onOpen()
  2. ค้นหาฟังก์ชัน onOpen() เพื่อดูการกล่าวถึงบริการหรือออบเจ็กต์ของ Apps Script ที่เชื่อมโยงกับฟังก์ชันดังกล่าว เช่น PropertiesService, SpreadsheetApp หรือ GmailApp
  3. หากมีการใช้บริการเพื่อวัตถุประสงค์อื่นนอกเหนือจากการสร้างองค์ประกอบ UI ให้นำออกหรือใส่ไว้ในบล็อกความคิดเห็น เหลือเพียงวิธีการต่อไปนี้: .getUi(), .createMenu(), .addItem() และ .addToUi() นอกจากนี้ ให้ค้นหาและนำบริการที่อยู่นอกฟังก์ชันออกด้วย
  4. ระบุฟังก์ชันที่อาจมีบรรทัดของโค้ดที่แสดงความคิดเห็นหรือนำออก ในขั้นตอนก่อนหน้า โดยเฉพาะฟังก์ชันที่ใช้ข้อมูลที่สร้างขึ้น และย้ายการเรียกใช้บริการไปยังฟังก์ชันที่ต้องการ จัดเรียงหรือเขียนโค้ดเบสใหม่ เพื่อให้รองรับการเปลี่ยนแปลงที่ทำในขั้นตอนก่อนหน้า
  5. บันทึกโค้ดและสร้างการติดตั้งใช้งานทดสอบ

    เมื่อสร้างการติดตั้งใช้งานทดสอบ ให้ตรวจสอบว่าช่องการกำหนดค่า เป็นติดตั้งสำหรับผู้ใช้ปัจจุบัน และข้อความใต้ช่องการกำหนดค่าระบุว่า ทดสอบใน AuthMode.None

  6. เปิดใช้การทดสอบการติดตั้งใช้งานและเปิดเมนูส่วนขยาย

  7. หากรายการเมนูทั้งหมดแสดงขึ้น แสดงว่าปัญหาได้รับการแก้ไขแล้ว หากเห็นเฉพาะเมนูความช่วยเหลือ ให้กลับไปที่ขั้นตอนที่ 1 คุณอาจพลาดการเรียกใช้บริการ