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

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

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

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

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

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

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

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

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

สถานะส่วนเสริมของเครื่องมือแก้ไข

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

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

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

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

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

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

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

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

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

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

โหมดการให้สิทธิ์จะมีผลกับวิธีการดำเนินการ 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
บริการใดๆ ที่ไม่เข้าถึงข้อมูลผู้ใช้ บริการใดๆ ที่ไม่เข้าถึงข้อมูลผู้ใช้ บริการทั้งหมด

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

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

ติดตั้งส่วนเสริม Editor แล้ว

เมื่อติดตั้งส่วนเสริม Editor จากสโตร์แล้ว ฟังก์ชัน onInstall() ของส่วนเสริมจะทำงานใน AuthMode.FULL ในโหมดการให้สิทธิ์นี้ ส่วนเสริมสามารถเรียกใช้กิจวัตรการตั้งค่าที่ซับซ้อน นอกจากนี้ คุณควรใช้ 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 คุณอาจไม่ได้รับสายเรียกรับบริการ