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

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

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

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

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

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

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

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

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

สถานะส่วนเสริมของ Editor

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

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

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

ติดตั้งแล้ว เปิดใช้
ใช้กับ ผู้ใช้ เอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีต
เกิดจาก รับส่วนเสริมจาก Store การรับส่วนเสริมจาก Store ขณะใช้เอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีตนั้น หรือ
การใช้ส่วนเสริมที่ติดตั้งไว้ก่อนหน้านี้ในเอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีตนั้น
เมนูที่แสดงต่อ เฉพาะผู้ใช้นั้น ในเอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีตที่พวกเขาเปิดหรือสร้าง ผู้ทำงานร่วมกันทุกคนในเอกสาร แบบฟอร์ม งานนำเสนอ หรือสเปรดชีตนั้น
โหมดการให้สิทธิ์สำหรับ 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 ของพารามิเตอร์เหตุการณ์ e ค่าของ e.authMode สอดคล้องกับค่าคงที่ใน Apps Script ScriptApp.AuthMode

โหมดการให้สิทธิ์จะมีผลกับวิธีการเรียกใช้ Apps Script ทั้งหมด ซึ่งรวมถึงการเรียกใช้จากเครื่องมือแก้ไขสคริปต์ จากรายการเมนู หรือจากคําเรียกใช้ google.script.run ของ Apps Script อย่างไรก็ตาม คุณจะตรวจสอบพร็อพเพอร์ตี้ 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() หากผู้ใช้คลิกรายการเมนูส่วนขยาย ระบบจะเรียกใช้

ติดตั้งส่วนเสริมเครื่องมือแก้ไขแล้ว

เมื่อติดตั้งส่วนเสริมสำหรับ Editor จาก Store ฟังก์ชัน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 คุณอาจพลาดการเรียกให้ช่างไปที่บ้าน