ขอบเขตการให้สิทธิ์

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

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

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

ในระหว่างขั้นตอนการให้สิทธิ์ Apps Script จะแสดงคำอธิบายขอบเขตที่จำเป็นซึ่งอ่านได้สำหรับผู้ใช้ เช่น หากสคริปต์ของคุณต้องใช้สิทธิ์เข้าถึงสเปรดชีตแบบอ่านอย่างเดียว ไฟล์ Manifest อาจมีขอบเขตเป็นhttps://www.googleapis.com/auth/spreadsheets.readonly ในระหว่างขั้นตอนการให้สิทธิ์ สคริปต์ที่มีขอบเขตนี้จะขอให้ผู้ใช้อนุญาตให้แอปพลิเคชันนี้ "ดูสเปรดชีตใน Google ชีต"

ขอบเขตบางรายการรวมขอบเขตอื่นๆ ไว้ด้วย ตัวอย่างเช่น เมื่อได้รับสิทธิ์ ขอบเขต https://www.googleapis.com/auth/spreadsheets จะอนุญาตให้เข้าถึงสเปรดชีตเพื่ออ่านและเขียน

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

ดูขอบเขต

คุณดูขอบเขตที่โปรเจ็กต์สคริปต์ต้องการในปัจจุบันได้โดยทำดังนี้

  1. เปิดโปรเจ็กต์สคริปต์
  2. คลิกภาพรวม ทางด้านซ้าย
  3. ดูขอบเขตในส่วนขอบเขต OAuth ของโปรเจ็กต์

กําหนดขอบเขตที่ชัดเจน

Apps Script จะกำหนดขอบเขตที่จําเป็นสําหรับสคริปต์โดยอัตโนมัติด้วยการสแกนโค้ดเพื่อหาการเรียกฟังก์ชันที่จําเป็น สําหรับสคริปต์ส่วนใหญ่ การดำเนินการนี้เพียงพอและช่วยประหยัดเวลาได้ แต่สําหรับส่วนเสริมที่เผยแพร่ เว็บแอป แอป Google Chat และการเรียกใช้ Google Chat API คุณต้องควบคุมขอบเขตโดยตรงมากขึ้น

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

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

  1. เปิดโปรเจ็กต์สคริปต์
  2. คลิกการตั้งค่าโปรเจ็กต์ ทางด้านซ้าย
  3. เลือกช่องทำเครื่องหมายแสดงไฟล์ Manifest "appsscript.json" ในเครื่องมือแก้ไข
  4. คลิกตัดต่อวิดีโอ ทางด้านซ้าย
  5. คลิกไฟล์ appsscript.json ทางด้านซ้าย
  6. ค้นหาช่องระดับบนสุดที่ติดป้ายกํากับว่า oauthScopes หากไม่มี คุณสามารถเพิ่มได้
  7. ฟิลด์ oauthScopes จะระบุอาร์เรย์สตริง หากต้องการตั้งค่าขอบเขตที่โปรเจ็กต์ใช้ ให้แทนที่เนื้อหาของอาร์เรย์นี้ด้วยขอบเขตที่คุณต้องการใช้ เช่น
          {
            ...
            "oauthScopes": [
              "https://www.googleapis.com/auth/spreadsheets.readonly",
              "https://www.googleapis.com/auth/userinfo.email"
            ],
           ...
          }
  8. คลิกบันทึก ที่ด้านบน

จัดการสิทธิ์ OAuth แบบละเอียด

หน้าจอขอความยินยอม OAuth แบบละเอียดช่วยให้ผู้ใช้ระบุขอบเขต OAuth แต่ละรายการที่ต้องการให้สิทธิ์ได้ สิทธิ์ OAuth แบบละเอียดช่วยให้ผู้ใช้ควบคุมข้อมูลบัญชีที่จะแชร์กับสคริปต์แต่ละรายการได้อย่างละเอียดยิ่งขึ้น ตัวอย่างเช่น สมมติว่าคุณพัฒนาสคริปต์ที่ขอสิทธิ์สำหรับทั้งขอบเขตอีเมลและปฏิทิน ผู้ใช้อาจต้องการใช้สคริปต์ของคุณเพื่อความสามารถเฉพาะกับ Google ปฏิทินเท่านั้น แต่ไม่ใช่ Gmail สิทธิ์ OAuth แบบละเอียดช่วยให้ผู้ใช้เลือกที่จะให้สิทธิ์เฉพาะปฏิทินเท่านั้นได้ โดยไม่ให้สิทธิ์ Gmail

ส่วนต่อไปนี้อธิบายวิธีหลักในการจัดการสิทธิ์ OAuth แบบละเอียด

กำหนดสิทธิ์สำหรับขอบเขตที่จำเป็นโดยอัตโนมัติ

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

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

  • requireScopes(authMode, oAuthScopes): ใช้เมธอดนี้สำหรับเวิร์กโฟลว์การดำเนินการที่ใช้ขอบเขตอย่างน้อย 1 รายการ แต่ไม่ใช่ขอบเขตทั้งหมดที่สคริปต์ใช้
  • requireAllScopes(authMode): ใช้เมธอดนี้หากขั้นตอนการดำเนินการใช้ขอบเขตทั้งหมดที่สคริปต์ใช้

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงวิธีเรียกใช้เมธอด requireScopes(authMode, oAuthScopes) และ requireAllScopes(authMode) สคริปต์ใช้ขอบเขตสำหรับ Gmail, ชีต และปฏิทิน ฟังก์ชัน sendEmail() ต้องใช้เฉพาะขอบเขตสำหรับ Gmail และชีต ส่วนฟังก์ชัน createEventSendEmail() ต้องใช้ขอบเขตทั้งหมดที่ใช้โดยสคริปต์

// This function requires the Gmail and Sheets scopes.
function sendEmail() {
  // Validates that the user has granted permission for the Gmail and Sheets scopes.
  // If not, the execution ends and prompts the user for authorization.
  ScriptApp.requireScopes(ScriptApp.AuthMode.FULL, [
    'https://mail.google.com/',
    'https://www.googleapis.com/auth/spreadsheets'
  ]);

  // Sends an email.
  GmailApp.sendEmail("dana@example.com", "Subject", "Body");
  Logger.log("Email sent successfully!");

  // Opens a spreadsheet and sheet to track the sent email.
  const ss = SpreadsheetApp.openById("abc1234567");
  const sheet = ss.getSheetByName("Email Tracker")

  // Gets the last row of the sheet.
  const lastRow = sheet.getLastRow();

  // Adds "Sent" to column E of the last row of the spreadsheet.
  sheet.getRange(lastRow, 5).setValue("Sent");
  Logger.log("Sheet updated successfully!");
}

// This function requires all scopes used by the script (Gmail,
// Calendar, and Sheets).
function createEventSendEmail() {
  // Validates that the user has granted permission for all scopes used by the
  // script. If not, the execution ends and prompts the user for authorization.
  ScriptApp.requireAllScopes(ScriptApp.AuthMode.FULL);

  // Creates an event.
  CalendarApp.getDefaultCalendar().createEvent(
    "Meeting",
    new Date("November 28, 2024 10:00:00"),
    new Date("November 28, 2024 11:00:00")
  );
  Logger.log("Calendar event created successfully!");

  // Sends an email.
  GmailApp.sendEmail("dana@example.com", "Subject 2", "Body 2");
  Logger.log("Email sent successfully!");

  // Opens a spreadsheet and sheet to track the created meeting and sent email.
  const ss = SpreadsheetApp.openById("abc1234567");
  const sheet = ss.getSheetByName("Email and Meeting Tracker")
  // Gets the last row
  const lastRow = sheet.getLastRow();

  // Adds "Sent" to column E of the last row
  sheet.getRange(lastRow, 5).setValue("Sent");
  // Adds "Meeting created" to column F of the last row
  sheet.getRange(lastRow, 6).setValue("Meeting created");
  Logger.log("Sheet updated successfully!");
}

สร้างประสบการณ์ที่กําหนดเองสําหรับขอบเขตที่ขาดหายไป

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

  • getAuthorizationInfo(authMode, oAuthScopes): ใช้วิธีนี้เพื่อตรวจสอบสถานะสิทธิ์ของขอบเขตที่เฉพาะเจาะจง
  • getAuthorizationInfo(authMode): ใช้วิธีการนี้เพื่อตรวจสอบสถานะสิทธิ์สำหรับขอบเขตทั้งหมดที่ใช้โดยสคริปต์

หากต้องการดูรายละเอียดสิทธิ์จากออบเจ็กต์ข้อมูลการให้สิทธิ์ เช่น รายการขอบเขตที่ได้รับอนุญาตและ URL เพื่อขอสิทธิ์ที่ขาดหายไป ให้ใช้เมธอดจากคลาส AuthorizationInfo

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงวิธีเรียกใช้เมธอด getAuthorizationInfo(authMode, oAuthScopes) เพื่อข้ามฟีเจอร์ที่เฉพาะเจาะจงภายในขั้นตอนการดำเนินการที่ยังไม่ได้ให้สิทธิ์ขอบเขตที่จำเป็น ซึ่งจะช่วยให้ขั้นตอนการดําเนินการที่เหลือดําเนินการต่อได้โดยไม่ต้องแจ้งให้ผู้ใช้ให้สิทธิ์สําหรับขอบเขตที่ขาดหายไป

// This function uses the Gmail scope and skips the email
// capabilities if the scope for Gmail hasn't been granted.
function myFunction() {
  const authInfo = ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL, ['https://mail.google.com/']);
  if (authInfo.getAuthorizationStatus() === ScriptApp.AuthorizationStatus.NOT_REQUIRED) {
    GmailApp.sendEmail("dana@example.com", "Subject", "Body");
    Logger.log("Email sent successfully!");
  } else {
    const scopesGranted = ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL).getAuthorizedScopes();
    console.warn(`Authorized scopes: ${scopesGranted} not enough to send mail, skipping.`);
  }
  // Continue the rest of the execution flow...
}

การยืนยัน OAuth

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

ขอบเขตที่จํากัด

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

โปรดดูรายการขอบเขตที่จำกัดทั้งหมดก่อนพยายามเผยแพร่ หากแอปของคุณใช้ API เหล่านี้ คุณต้องปฏิบัติตามข้อกำหนดเพิ่มเติมสำหรับขอบเขตนั้นๆ ของ API ก่อนเผยแพร่