ทำงานกับกิจกรรมจาก Google ไดรฟ์

หน้านี้อธิบายวิธีรับเหตุการณ์ Google ไดรฟ์จาก Google Cloud Pub/Sub

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

ตัวอย่างวิธีใช้เหตุการณ์มีดังนี้

  • สังเกตและตอบสนองต่อการเปลี่ยนแปลงในไฟล์ โฟลเดอร์ หรือไดรฟ์ที่แชร์ เช่น เมื่อมีการแก้ไขไฟล์หรือมีการอัปโหลดฉบับแก้ไขใหม่

  • ตรวจสอบการเปลี่ยนแปลงไฟล์เพื่อปรับปรุงประสิทธิภาพของแอป

  • ตรวจสอบกิจกรรมต่างๆ เช่น การแชร์ไฟล์ การย้ายไฟล์ และการลบไฟล์ เพื่อช่วยตรวจหาการรั่วไหลของข้อมูลที่อาจเกิดขึ้นและการเข้าถึงที่ไม่ได้รับอนุญาต

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

  • ติดตามการเปลี่ยนแปลงไฟล์เพื่อยืนยันการปฏิบัติตามข้อกำหนดด้านกฎระเบียบหรือนโยบายด้านความปลอดภัย

  • วิเคราะห์กิจกรรมในไดรฟ์โดยใช้ผลิตภัณฑ์อื่นๆ ของ Google Cloud เช่น Eventarc, Workflows, และ BigQuery

วิธีทำงานของเหตุการณ์

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

ไดรฟ์จัดหมวดหมู่เหตุการณ์ตามประเภท ประเภทเหตุการณ์ช่วยให้คุณกรองและรับเฉพาะข้อมูลประเภทที่ต้องการ รวมถึงจัดการกิจกรรมที่คล้ายกันในลักษณะเดียวกันได้

ตารางต่อไปนี้แสดงวิธีที่กิจกรรมตัวอย่างในไดรฟ์ส่งผลต่อทรัพยากร Drive API ที่เกี่ยวข้อง และประเภทเหตุการณ์ที่แอปไดรฟ์ได้รับ

กิจกรรม ทรัพยากร Drive API ประเภทเหตุการณ์
ผู้ใช้สร้างข้อเสนอการเข้าถึงในไฟล์ ระบบจะสร้างทรัพยากร AccessProposal ข้อเสนอการเข้าถึงใหม่

ผู้ใช้สร้างการอนุมัติในไฟล์

ระบบจะสร้างทรัพยากร Approval การอนุมัติใหม่
ผู้ใช้โพสต์ความคิดเห็นในไฟล์ Google เอกสาร, ชีต หรือสไลด์ ระบบจะสร้างทรัพยากร Comment ความคิดเห็นใหม่
ผู้ใช้เพิ่มไฟล์ลงในโฟลเดอร์หรือไดรฟ์ที่แชร์ ระบบจะสร้างทรัพยากร File ไฟล์ใหม่
ผู้ใช้สร้างสิทธิ์ในไฟล์ ระบบจะสร้างทรัพยากร Permission สิทธิ์ใหม่
ผู้ใช้ตอบกลับความคิดเห็น ระบบจะสร้างทรัพยากร Reply คำตอบใหม่

รับเหตุการณ์จาก Google ไดรฟ์

โดยปกติแล้ว แอปไดรฟ์จะค้นหาเหตุการณ์ผ่าน Drive API หรือ Google Drive Activity API แต่ตอนนี้มีวิธีที่ 3 ในการรับเหตุการณ์แล้ว นั่นคือการเพิ่มเหตุการณ์ในไดรฟ์ใน Google Workspace Events API

  • สมัครรับข้อมูลเหตุการณ์โดยใช้ Google Workspace Events API เพื่อรับเหตุการณ์เมื่อเกิดขึ้น ดูข้อมูลเพิ่มเติมได้ที่สมัครรับข้อมูล เหตุการณ์ Google ไดรฟ์

  • สมัครรับข้อมูลเหตุการณ์โดยใช้ Drive API รับเหตุการณ์การเปลี่ยนแปลงของผู้ใช้ ด้วยเมธอด changes.watch หรือเหตุการณ์การเปลี่ยนแปลงไฟล์ โดยใช้เมธอด files.watch

  • ค้นหาเหตุการณ์ล่าสุดโดยเรียก Google Drive Activity API

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

สมัครรับข้อมูลเหตุการณ์ Google Workspace สมัครรับข้อมูลเหตุการณ์การดู Drive API ค้นหาเหตุการณ์ Drive Activity API
กรณีการใช้งาน
  • ประมวลผลหรือตอบสนองต่อเหตุการณ์แบบเรียลไทม์
  • ตรวจสอบการเปลี่ยนแปลงทรัพยากรเพื่อปรับปรุงประสิทธิภาพของแอป
  • รับข้อมูลเหตุการณ์ที่มีโครงสร้างผ่าน Pub/Sub และใช้ผลิตภัณฑ์ Google Cloud เช่น Cloud Run
  • ตรวจหาการเปลี่ยนแปลงข้อมูลเมตาของไฟล์และตรวจสอบการเปลี่ยนแปลงรายการที่เฉพาะเจาะจงอย่างมีประสิทธิภาพด้วยการแจ้งเตือนแบบเรียลไทม์
  • รองรับ URL การเรียกกลับของ Webhook เพื่อหลีกเลี่ยงการโพลปลายทาง API ซ้ำๆ
  • ดึงข้อมูลประวัติโดยละเอียดของกิจกรรมทั้งหมด รวมถึงข้อมูลแบบละเอียดเกี่ยวกับแต่ละเหตุการณ์
  • ดึงข้อมูลกิจกรรมที่แม่นยำซึ่งรวมถึงข้อมูล ActionDetail, Actor และ Target สำหรับงานที่เฉพาะเจาะจง เช่น การตรวจสอบ
API Google Workspace Events API Google Drive API Google Drive Activity API
แหล่งที่มาของเหตุการณ์ ไฟล์ โฟลเดอร์ และไดรฟ์ที่แชร์ changes.watch และ files.watch DriveActivity
เหตุการณ์ที่รองรับ
  • AccessProposal
  • Approval
  • Comment
  • File
  • Permission
  • Reply
ดูรายการประเภทเหตุการณ์ที่รองรับได้ที่ ประเภทเหตุการณ์สำหรับการสร้างการสมัครรับข้อมูล ใน เอกสารประกอบของ Google Workspace Events API
Channel

ดูรายการประเภทเหตุการณ์ที่รองรับได้ที่ ทำความเข้าใจเหตุการณ์การแจ้งเตือน Google Drive API ในเอกสารประกอบของ Drive API
Action

ดูรายการช่องที่รองรับได้ที่ Action ทรัพยากร ในเอกสารอ้างอิง Drive Activity API
รูปแบบเหตุการณ์ ข้อความ Pub/Sub ที่จัดรูปแบบตาม ข้อกำหนด CloudEvent ดูรายละเอียดได้ที่ โครงสร้างของเหตุการณ์ Google Workspace ทรัพยากร Drive API (Channel) ทรัพยากร Drive Activity API (Action)
ข้อมูลเหตุการณ์ สตริงที่เข้ารหัสแบบ Base64 พร้อมข้อมูลทรัพยากรหรือไม่ก็ได้ ดูเพย์โหลดตัวอย่างได้ที่ข้อมูลเหตุการณ์ เพย์โหลด JSON ที่มีข้อมูลทรัพยากร ดูเพย์โหลดตัวอย่างได้ที่ทรัพยากร Channel ในเอกสารอ้างอิง เพย์โหลด JSON ที่มีข้อมูลทรัพยากร ดูเพย์โหลดตัวอย่างได้ที่ activity.query เนื้อหาการตอบกลับ ในเอกสารอ้างอิง

เริ่มต้นใช้งานเหตุการณ์ในไดรฟ์

คู่มือนี้อธิบายวิธีสร้างและจัดการการสมัครรับข้อมูลเหตุการณ์ Google Workspace ในทรัพยากรในไดรฟ์ ซึ่งจะช่วยให้แอปของคุณรับเหตุการณ์ผ่าน Google Cloud Pub/Sub ได้

สร้างโปรเจ็กต์ Google Cloud

หากต้องการสร้างโปรเจ็กต์ Google Cloud โปรดดูสร้างโปรเจ็กต์ Google Cloud

เปิดใช้ Google Workspace Events API, Google Cloud Pub/Sub API และ Google Drive API

ก่อนใช้ Google API คุณต้องเปิด API เหล่านั้นในโปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google คุณสามารถเปิด API อย่างน้อย 1 รายการในโปรเจ็กต์ Google Cloud เดียวได้

คอนโซล Google Cloud

  1. ในคอนโซล Google Cloud ให้เปิดโปรเจ็กต์ที่อยู่ในระบบคลาวด์ Google Cloud สำหรับแอป แล้วเปิดใช้ Google Workspace Events API, Pub/Sub API และ Drive API โดยทำดังนี้

    เปิดใช้ API

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

  3. ยืนยันว่าคุณกำลังเปิดใช้ API ที่ถูกต้อง แล้วคลิกเปิดใช้

gcloud

  1. ลงชื่อเข้าใช้บัญชี Google ในไดเรกทอรีงานโดยทำดังนี้

    gcloud auth login
  2. ตั้งค่าโปรเจ็กต์เป็นโปรเจ็กต์ที่อยู่ในระบบคลาวด์สำหรับแอปโดยทำดังนี้

    gcloud config set project PROJECT_ID

    แทนที่ PROJECT_ID ด้วยรหัสโปรเจ็กต์ สำหรับโปรเจ็กต์ที่อยู่ในระบบคลาวด์ของแอป

  3. เปิดใช้ Google Workspace Events API, Pub/Sub API และ Drive API โดยทำดังนี้

    gcloud services enable workspaceevents.googleapis.com \
    pubsub.googleapis.com \
    drive.googleapis.com

ตั้งค่ารหัสไคลเอ็นต์

หากต้องการสร้างรหัสไคลเอ็นต์ OAuth 2.0 โปรดดูสร้างรหัสไคลเอ็นต์ OAuth ข้อมูลเข้าสู่ระบบ

สร้างหัวข้อ Pub/Sub

ก่อนสร้างการสมัครรับข้อมูล คุณต้องสร้างหัวข้อ Google Cloud Pub/Sub ที่รับเหตุการณ์ที่เกี่ยวข้องซึ่งแอปพลิเคชันของคุณสนใจ หากต้องการสร้าง หัวข้อ Pub/Sub โปรดดูสร้างและสมัครรับข้อมูลหัวข้อ Pub/Sub

อย่าลืมอ้างอิงบัญชีบริการของไดรฟ์ (drive-api-event-push@system.gserviceaccount.com) สำหรับคำขอ

สร้างการสมัครรับข้อมูลไดรฟ์

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

แอปพลิเคชัน Node.js ต่อไปนี้จะสร้างการสมัครรับข้อมูลเหตุการณ์ในไดรฟ์ในไฟล์หรือโฟลเดอร์เพื่อฟังเหตุการณ์การเปลี่ยนแปลงเนื้อหา ดูข้อมูลเพิ่มเติมได้ที่สร้างการสมัครรับข้อมูล Google Workspace

หากต้องการเรียกใช้ตัวอย่างนี้ โปรดตรวจสอบว่าคุณได้ติดตั้งทั้ง Node.js & npm แล้ว นอกจากนี้ คุณยังต้องตรวจสอบว่าได้ติดตั้งทรัพยากร Dependency ที่จำเป็นเพื่อเรียกใช้ตัวอย่างนี้แล้ว

# Install needed dependencies
$ npm install googleapis @google-cloud/local-auth axios

หากต้องการสร้างการสมัครรับข้อมูลไดรฟ์ ให้ใช้ เมธอด subscriptions.create ของ Google Workspace Events API เพื่อสร้าง Subscription โดยทำดังนี้

// app.js

const fs = require('fs').promises;
const {authenticate} = require('@google-cloud/local-auth');
const {google} = require('googleapis');
const axios = require('axios');

// Scopes for Google Drive API access.
const SCOPES = ['SCOPES'];

/**
 * Authenticates the user running the script.
 * @return {Promise<OAuth2Client>} The authorized client.
 */
async function authorize() {
  const client = await authenticate({
    scopes: SCOPES,
    keyfilePath: 'credentials.json',
  });
  if (client.credentials) {
    const content = await fs.readFile('credentials.json');
    const keys = JSON.parse(content);
    const {client_id, client_secret} = keys.installed || keys.web;
    const payload = JSON.stringify({
      type: 'authorized_user',
      client_id,
      client_secret,
      refresh_token: client.credentials.refresh_token,
    });
    await fs.writeFile('token.json', payload);
    return client;
  } else {
    throw new Exception(
        'credentials.json did not have the Oauth client secret or it was not properly formatted');
  }
  }

/**
 * Creates a subscription to Google Drive events.
 * @param {OAuth2Client} authClient An authorized OAuth2 client.
 */
async function createSubscription(authClient) {
  const url = 'https://workspaceevents.googleapis.com/v1/subscriptions';
  const data = {
    targetResource: 'TARGET_RESOURCE',
    eventTypes: ['EVENT_TYPES'],
    payload_options: {
      include_resource: {
        {
          'RESOURCE_DATA'
        }
      }
    },
    drive_options: {
      include_descendants: {
        {
          'INCLUDE_DESCENDANTS'
        }
      }
    },
    notification_endpoint: {pubsub_topic: 'TOPIC_NAME'}
  };
  try {
    const {token} = await authClient.getAccessToken();
    const response = await axios.post(
        url, data, {headers: {'Authorization': `Bearer ${token}`}});
    console.log('Subscription created:', response.data);
  } catch (error) {
    const message = error.response ? error.response.data : error.message;
    console.error('Error creating subscription:', message);
  }
}

authorize().then(createSubscription).catch(console.error);

แทนที่ค่าต่อไปนี้

  • SCOPES: ขอบเขต OAuth อย่างน้อย 1 รายการที่รองรับเหตุการณ์แต่ละประเภทสำหรับการ สมัครรับข้อมูล จัดรูปแบบเป็นอาร์เรย์ของสตริง หากต้องการแสดงขอบเขตหลายรายการ ให้คั่นด้วยคอมมา แนวทางปฏิบัติแนะนำคือคุณควรใช้ขอบเขตที่จำกัดที่สุดซึ่งยังคงอนุญาตให้แอปทำงานได้ เช่น 'https://www.googleapis.com/auth/drive.file'

  • TARGET_RESOURCE: ทรัพยากร Google Workspace ที่คุณสมัครรับข้อมูล ซึ่งจัดรูปแบบเป็นชื่อทรัพยากรแบบเต็ม เช่น หากต้องการสมัครรับข้อมูลไฟล์หรือโฟลเดอร์ในไดรฟ์ ให้ใช้ //drive.googleapis.com/files/FileID

  • EVENT_TYPES: ประเภทเหตุการณ์อย่างน้อย 1 ประเภทที่คุณต้องการสมัครรับข้อมูลในทรัพยากรเป้าหมาย จัดรูปแบบเป็นอาร์เรย์ของ สตริง เช่น 'google.workspace.drive.file.v3.contentChanged'

  • RESOURCE_DATA: บูลีนที่ระบุว่าการสมัครรับข้อมูลรวมข้อมูลทรัพยากรในเพย์โหลดเหตุการณ์หรือไม่ พร็อพเพอร์ตี้นี้ส่งผลต่อระยะเวลาของการสมัครรับข้อมูล ดูข้อมูลเพิ่มเติมได้ที่ข้อมูล เหตุการณ์

    • True: รวมข้อมูลทรัพยากรทั้งหมด หากต้องการจำกัดช่องที่จะรวม ให้เพิ่ม fieldMask และระบุช่องอย่างน้อย 1 ช่องสำหรับทรัพยากรที่เปลี่ยนแปลง เฉพาะการสมัครรับข้อมูลทรัพยากร Chat และไดรฟ์เท่านั้นที่รองรับการรวมข้อมูลทรัพยากร

    • False: ไม่รวมข้อมูลทรัพยากร

  • INCLUDE_DESCENDANTS: ช่องบูลีนที่เป็นส่วนหนึ่งของ DriveOptions ใช้ได้เฉพาะเมื่อ targetResource เป็นไฟล์ในไดรฟ์หรือไดรฟ์ที่แชร์ซึ่งตั้งค่าประเภท MIME เป็น application/vnd.google-apps.folder ไม่สามารถตั้งค่าในโฟลเดอร์รูทของไดรฟ์ของฉันหรือไดรฟ์ที่แชร์

    • True: การสมัครรับข้อมูลรวมไฟล์ในไดรฟ์ทั้งหมดที่สืบทอดมาในรายการเหตุการณ์

    • False: ระบบจะสร้างการสมัครรับข้อมูลสำหรับไฟล์เดียวหรือไดรฟ์ที่แชร์ที่ระบุเป็น targetResource

  • TOPIC_NAME: ชื่อแบบเต็มของหัวข้อ Pub/Sub ที่คุณสร้างในโปรเจ็กต์ที่อยู่ในระบบคลาวด์ หัวข้อ Pub/Sub นี้จะรับเหตุการณ์สำหรับการสมัครรับข้อมูล จัดรูปแบบเป็น projects/PROJECT_ID/topics/TOPIC_ID The notificationEndpoint ช่องใช้เพื่อระบุหัวข้อ Pub/Sub และเป็นที่ที่การสมัครรับข้อมูล ส่งเหตุการณ์

ทดสอบการสมัครรับข้อมูลไดรฟ์

หากต้องการทดสอบว่าคุณได้รับเหตุการณ์ในไดรฟ์หรือไม่ คุณสามารถทริกเกอร์เหตุการณ์และดึงข้อความไปยังการสมัครรับข้อมูล Pub/Sub ดูข้อมูลเพิ่มเติมได้ที่ ทดสอบการสมัครรับข้อมูล Google Workspace

ประมวลผลเหตุการณ์ในไดรฟ์โดยใช้ Cloud Functions

ระบบจะส่งเหตุการณ์ในไดรฟ์ไปยังหัวข้อ Pub/Sub ในการสมัครรับข้อมูลที่คุณสร้าง โปรดตรวจสอบว่าเมื่อสร้างทริกเกอร์ หัวข้อ Pub/Sub สำหรับทริกเกอร์ตรงกับหัวข้อ Pub/Sub ในการสมัครรับข้อมูลเหตุการณ์ จากนั้นคุณสามารถ ติดตั้งใช้งานฟังก์ชัน Cloud Run และทำการแก้ไขไฟล์เพื่อดูการเปลี่ยนแปลงเหตุการณ์ในบันทึก

ก่อนสร้างฟังก์ชัน ให้อัปเดต package.json สำหรับทรัพยากร Dependency โดยทำดังนี้

{
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0",
    "cloudevents": "^8.0.0"
  }
}

จากนั้นสร้างซอร์สโค้ดสำหรับฟังก์ชันโดยทำดังนี้

const functions = require('@google-cloud/functions-framework');
const { HTTP } = require("cloudevents");

/**
 * A Cloud Function triggered by Pub/Sub messages containing Google Drive activity events.
 * This function processes different types of Drive events.
 *
 * @param {object} cloudEvent The CloudEvent object.
 * @param {object} cloudEvent.data The data payload from the event source.
 */
functions.cloudEvent('helloFromDrive', async (cloudEvent) => {
  try {
    // Verify the Pub/Sub message exists
    if (!cloudEvent.data || !cloudEvent.data.message) {
      console.warn("Event is missing the Pub/Sub message payload.");
      return;
    }

    // Extract the Pub/Sub message details
    const { message } = cloudEvent.data;
    const { attributes, data } = message;

    // The original Drive CloudEvent is reconstructed from the Pub/Sub message attributes
    const driveEvent = HTTP.toEvent({ headers: attributes });
    const { type } = driveEvent;

    // The Drive event's payload is a base64 encoded JSON string
    const payload = JSON.parse(Buffer.from(data, "base64").toString());

    console.log(`Processing Drive event type: ${type}`);

    // Use a switch statement to handle different event types
    switch (type) {
      case 'google.workspace.drive.file.v3.contentChanged':
        console.log('File Content Changed:', payload);
        break;
      case 'google.workspace.drive.accessproposal.v3.created':
        console.log('Access Proposal Created:', payload);
        break;
      default:
        console.log(`Received unhandled event type: ${type}`);
        break;
    }
  } catch (error) {
    console.error("An error occurred while processing the Drive event:", error);
  }
});

ข้อจำกัด

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