ผู้ใช้ต้องให้สิทธิ์โปรเจ็กต์สคริปต์ที่เข้าถึงข้อมูลหรือดำเนินการในนามของตน เมื่อผู้ใช้เรียกใช้สคริปต์ที่ต้องมีการให้สิทธิ์เป็นครั้งแรก 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 แบบละเอียด
ดูขอบเขต
คุณดูขอบเขตที่โปรเจ็กต์สคริปต์ต้องการในปัจจุบันได้โดยทำดังนี้
- เปิดโปรเจ็กต์สคริปต์
- คลิกภาพรวม ทางด้านซ้าย
- ดูขอบเขตในส่วนขอบเขต OAuth ของโปรเจ็กต์
กําหนดขอบเขตที่ชัดเจน
Apps Script จะกำหนดขอบเขตที่จําเป็นสําหรับสคริปต์โดยอัตโนมัติด้วยการสแกนโค้ดเพื่อหาการเรียกฟังก์ชันที่จําเป็น สําหรับสคริปต์ส่วนใหญ่ การดำเนินการนี้เพียงพอและช่วยประหยัดเวลาได้ แต่สําหรับส่วนเสริมที่เผยแพร่ เว็บแอป แอป Google Chat และการเรียกใช้ Google Chat API คุณต้องควบคุมขอบเขตโดยตรงมากขึ้น
บางครั้ง Apps Script จะกำหนดขอบเขตที่อนุญาตมากให้กับโปรเจ็กต์โดยอัตโนมัติ ซึ่งหมายความว่าสคริปต์ของคุณขอข้อมูลจากผู้ใช้มากกว่าที่จำเป็น ซึ่งเป็นแนวทางปฏิบัติที่ไม่ถูกต้อง สําหรับสคริปต์ที่เผยแพร่แล้ว คุณต้องแทนที่ขอบเขตแบบกว้างด้วยชุดที่จํากัดมากขึ้นซึ่งครอบคลุมความต้องการใช้สคริปต์เท่านั้น
คุณสามารถตั้งค่าขอบเขตที่โปรเจ็กต์สคริปต์ใช้อย่างชัดเจนได้โดยการแก้ไขไฟล์ manifest ช่องไฟล์ Manifest
oauthScopes
คืออาร์เรย์ของขอบเขตทั้งหมดที่โปรเจ็กต์ใช้ หากต้องการตั้งค่าขอบเขตของโปรเจ็กต์ ให้ทําดังนี้
- เปิดโปรเจ็กต์สคริปต์
- คลิกการตั้งค่าโปรเจ็กต์ ทางด้านซ้าย
- เลือกช่องทำเครื่องหมายแสดงไฟล์ Manifest "appsscript.json" ในเครื่องมือแก้ไข
- คลิกตัดต่อวิดีโอ ทางด้านซ้าย
- คลิกไฟล์
appsscript.json
ทางด้านซ้าย - ค้นหาช่องระดับบนสุดที่ติดป้ายกํากับว่า
oauthScopes
หากไม่มี คุณสามารถเพิ่มได้ - ฟิลด์
oauthScopes
จะระบุอาร์เรย์สตริง หากต้องการตั้งค่าขอบเขตที่โปรเจ็กต์ใช้ ให้แทนที่เนื้อหาของอาร์เรย์นี้ด้วยขอบเขตที่คุณต้องการใช้ เช่น{ ... "oauthScopes": [ "https://www.googleapis.com/auth/spreadsheets.readonly", "https://www.googleapis.com/auth/userinfo.email" ], ... }
- คลิกบันทึก ที่ด้านบน
จัดการสิทธิ์ 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 ก่อนที่คุณจะสามารถเผยแพร่โปรเจ็กต์แบบสาธารณะเป็นเว็บแอปหรือส่วนเสริมได้ ดูข้อมูลเพิ่มเติมได้ที่คู่มือต่อไปนี้
- การตรวจสอบไคลเอ็นต์ OAuth สําหรับ Apps Script
- แอปที่ยังไม่ยืนยัน
- คำถามที่พบบ่อยเกี่ยวกับการยืนยัน OAuth
- บริการ Google APIs: นโยบายข้อมูลผู้ใช้
ขอบเขตที่จํากัด
นอกจากขอบเขตที่มีความละเอียดอ่อนแล้ว ขอบเขตบางรายการยังจัดอยู่ในประเภทจำกัดและอยู่ภายใต้กฎเพิ่มเติมที่จะช่วยปกป้องข้อมูลผู้ใช้ หากคุณตั้งใจจะเผยแพร่เว็บแอปหรือส่วนเสริมที่ใช้ขอบเขตที่จํากัดอย่างน้อย 1 รายการ แอปต้องเป็นไปตามข้อจํากัดที่ระบุไว้ทั้งหมดก่อนจึงจะเผยแพร่ได้
โปรดดูรายการขอบเขตที่จำกัดทั้งหมดก่อนพยายามเผยแพร่ หากแอปของคุณใช้ API เหล่านี้ คุณต้องปฏิบัติตามข้อกำหนดเพิ่มเติมสำหรับขอบเขตนั้นๆ ของ API ก่อนเผยแพร่