برنامه نویسی

از طریق یک اسکریپت محلی از طریق تأیید اعتبار CLI gcloud در Google Sheets بنویسید

Summarize this content to 400 words in Persian Lang
اخیراً نیاز داشتم که داده‌ها را از API GitHub بیرون بکشم و در Google Sheet منتشر کنم تا بتوانم نمودارهایی را درباره حجم کاری بررسی کد به اشتراک بگذارم. این پست در مورد چگونگی کارکرد احراز هویت است.

من یک اسکریپت Node.js نوشتم زیرا مورد استفاده من برای BASH بسیار پیچیده بود و برای Go خیلی موقتی به نظر می رسید. در ابتدا، اسکریپت داده‌های CSV موقتی را تولید می‌کرد که می‌توانستم به‌طور دستی با استفاده از ویژگی Paste-as-CSV در Google Sheets کپی کنم. پس از چند دور کپی دستی، می‌خواستم از زمانم عاقلانه استفاده کنم: تخمین زدم که می‌توانم یکپارچگی Sheets را در عرض چند ساعت به کار ببرم و اگر اینطور باشد، می‌توانم این کار را انجام دهم.احتمالا ظرف چند ماه پرداخت می شود.

کنار: Sheets پایگاه داده من نیست. این رابط کاربری گزارش داده من است. از Sheets به عنوان پایگاه داده خود استفاده نکنید.

نزدیک به 4 ساعت طول کشید تا بتوانم این کار را انجام دهم، زیرا احراز هویت سخت است. این پست مسیر مستقیم تری برای یک راه حل کاری را نشان می دهد.

منحرف شدن با پیچیدگی ایجاد یک برنامه oAuth آسان است، و در حالی که من به خصوص استفاده از یک حساب سرویس از سرویس های Cloud خود را دوست دارم،هنگام دویدن به صورت محلی راحت تر است.

ترفندی که من یاد گرفتم این است که راه‌اندازی اعتبارنامه‌های پیش‌فرض برنامه توسط Gcloud CLI می‌تواند به‌عنوان نوعی پروکسی OAuth برای کد Google Workspace عمل کند، با گسترش نحوه احراز هویت حساب شما با Google و شامل برخی مجوزهای بیشتر (OAuth Scopes).

🔐 احراز هویت محلی با gcloud CLI

برای درخواست API به Google Sheets، API Sheets را در پروژه Cloud خود فعال کنید:

$> gcloud services enable sheets.googleapis.com

Operation “operations/acat.p2-480745230567-02564c8d-c6ba-4f60-90bd-13f33e41f0fe” finished successfully.

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خود را تنظیم کنید اعتبار پیش فرض برنامه، همچنین برخی از دامنه های OAuth غیر پیش فرض را ادعا می کند تا اعتبارنامه را بتوان با برگه ها استفاده کرد:

$> gcloud auth application-default login –scopes \
‘https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets’

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این یک جریان OAuth را آغاز می کند که شامل بازدید از یک صفحه وب در مرورگر شما می شود. بسته به پیکربندی ترمینال، ممکن است یک URL نمایش داده شود یا حتی صفحه را باز کند.

وقتی به gcloud این محدوده اعطا شد، کدی که می‌تواند به اعتبارنامه‌های محلی شما دسترسی داشته باشد، به همه داده‌های کاربرگ‌نگار Google شما دسترسی خواندن/نوشتن خواهد داشت. می‌توانید این دستور را بدون محدوده‌های سفارشی‌سازی شده مجدداً اجرا کنید تا در صورت لزوم آن دسترسی را روشن و خاموش کنید.

🗝️ یک Node Client برای Google Sheets راه اندازی کنید

import {google} from ‘googleapis’;

function sheetsClient() {
const authConfig = new google.auth.GoogleAuth({
    scopes: [
        // Only ‘spreadsheets’ scope is needed in the code.
            // gcloud CLI also needs ‘cloud-platform’ and ‘drive’.
            ‘https://www.googleapis.com/auth/spreadsheets’
        ],
    });
    const auth = await authConfig.getClient();
    return google.sheets({version: ‘v4’, auth});
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

🖇 داده ها را به برگه اضافه کنید

نمونه ای از اسناد در مورد نحوه الحاق داده ها به برگه(روی تب Node.js کلیک کنید) به خوبی کار کرد. با این حال، نمی‌توانم بفهمم چگونه می‌توانم احراز هویت را از آنجا کار کنم. این نمونه زمانی کار کرد که ترفند بالا را برای افزودن دامنه‌های OAuth از دست رفته به اعتبارنامه‌های محیط برنامه‌نویس خود فهمیدم.

من چند تغییر ایجاد کردم تا استفاده مجدد آسان‌تر از کلاینت را فعال کنم، درخواست را به گونه‌ای متفاوت تنظیم کنم، و تاکید کنم که چگونه می‌خواهم داده‌ها توسط Sheets مدیریت شود.

کد من برای اضافه کردن داده ها به برگه، با استفاده از کد اولیه مشتری در بالا:

let client;

async function appendDataToSheet(spreadsheetId, tab, values) {
if (!client) {
client = sheetsClient();
}

try {
const result = await client.spreadsheets.values.append({
spreadsheetId,
range: `${tab}!A2:AG`,
// Use my data as provided.
valueInputOption: ‘RAW’,
// Inserts rows as part of appending to reduce overwrites.
insertDataOption: ‘INSERT_ROWS’,
requestBody: { values },
});
console.log(`${result.data.updates.updatedCells} cells appended.`);
} catch(e) {
// Show the error, do not stop. Cross-reference the error with terminal output
// and decide case-by-case to re-run the script or manually copy data.
console.error(e);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من از “append” استفاده می کنم زیرا اسکریپت من معیارهای ماهانه را جمع آوری می کند و append به من امکان می دهد بدون حذف ردیف های قبلی ردیف های جدید اضافه کنم.

در اینجا مثالی از نحوه فراخوانی آمده است appendDataToSheet() تابع:

const values = [
// Each nested array is a spreadsheet row.
[1, 2, 3, 4, ‘luggage’],
[4, 5, 6, ‘N/A’, ‘sticks’],
];
appendDataToSheet(
‘HPDkfqdu6rfIq5-4uTGDqz2tvmPxDZMul27JFexample’,
‘Exported Data Tab’,
values
);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نکات خوبی در مورد کار با Sheets API در اسناد وجود دارد، مانند پیشنهاد عدم ارسال بیش از یک درخواست API در ثانیه در هر برگ. من راه سخت را فهمیدم: بازنویسی داده ها از درخواست اول با داده های درخواست دوم.

🚀 ارسال کنید!

اگر به سمت تولید این کار پیش بروم، ممکن است به استفاده از آن روی بیاورمCloud Scheduler و Cloud Run Jobs. اگر مایلید در مورد آن بخوانید به من اطلاع دهید.

عکس روی جلد توسط گلیب آلبوفسکی در Unsplash

اخیراً نیاز داشتم که داده‌ها را از API GitHub بیرون بکشم و در Google Sheet منتشر کنم تا بتوانم نمودارهایی را درباره حجم کاری بررسی کد به اشتراک بگذارم. این پست در مورد چگونگی کارکرد احراز هویت است.

من یک اسکریپت Node.js نوشتم زیرا مورد استفاده من برای BASH بسیار پیچیده بود و برای Go خیلی موقتی به نظر می رسید. در ابتدا، اسکریپت داده‌های CSV موقتی را تولید می‌کرد که می‌توانستم به‌طور دستی با استفاده از ویژگی Paste-as-CSV در Google Sheets کپی کنم. پس از چند دور کپی دستی، می‌خواستم از زمانم عاقلانه استفاده کنم: تخمین زدم که می‌توانم یکپارچگی Sheets را در عرض چند ساعت به کار ببرم و اگر اینطور باشد، می‌توانم این کار را انجام دهم.
احتمالا ظرف چند ماه پرداخت می شود.

کنار: Sheets پایگاه داده من نیست. این رابط کاربری گزارش داده من است. از Sheets به عنوان پایگاه داده خود استفاده نکنید.

نزدیک به 4 ساعت طول کشید تا بتوانم این کار را انجام دهم، زیرا احراز هویت سخت است. این پست مسیر مستقیم تری برای یک راه حل کاری را نشان می دهد.

منحرف شدن با پیچیدگی ایجاد یک برنامه oAuth آسان است، و در حالی که من به خصوص استفاده از یک حساب سرویس از سرویس های Cloud خود را دوست دارم،
هنگام دویدن به صورت محلی راحت تر است.

ترفندی که من یاد گرفتم این است که راه‌اندازی اعتبارنامه‌های پیش‌فرض برنامه توسط Gcloud CLI می‌تواند به‌عنوان نوعی پروکسی OAuth برای کد Google Workspace عمل کند، با گسترش نحوه احراز هویت حساب شما با Google و شامل برخی مجوزهای بیشتر (OAuth Scopes).

🔐 احراز هویت محلی با gcloud CLI

برای درخواست API به Google Sheets، API Sheets را در پروژه Cloud خود فعال کنید:

$> gcloud services enable sheets.googleapis.com

Operation "operations/acat.p2-480745230567-02564c8d-c6ba-4f60-90bd-13f33e41f0fe" finished successfully.
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خود را تنظیم کنید اعتبار پیش فرض برنامه، همچنین برخی از دامنه های OAuth غیر پیش فرض را ادعا می کند تا اعتبارنامه را بتوان با برگه ها استفاده کرد:

$> gcloud auth application-default login --scopes \
   'https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این یک جریان OAuth را آغاز می کند که شامل بازدید از یک صفحه وب در مرورگر شما می شود. بسته به پیکربندی ترمینال، ممکن است یک URL نمایش داده شود یا حتی صفحه را باز کند.

وقتی به gcloud این محدوده اعطا شد، کدی که می‌تواند به اعتبارنامه‌های محلی شما دسترسی داشته باشد، به همه داده‌های کاربرگ‌نگار Google شما دسترسی خواندن/نوشتن خواهد داشت. می‌توانید این دستور را بدون محدوده‌های سفارشی‌سازی شده مجدداً اجرا کنید تا در صورت لزوم آن دسترسی را روشن و خاموش کنید.

🗝️ یک Node Client برای Google Sheets راه اندازی کنید

import {google} from 'googleapis';

function sheetsClient() {
    const authConfig = new google.auth.GoogleAuth({
        scopes: [
            // Only 'spreadsheets' scope is needed in the code.
            // gcloud CLI also needs 'cloud-platform' and 'drive'.
            'https://www.googleapis.com/auth/spreadsheets'
        ],
    });
    const auth = await authConfig.getClient();
    return google.sheets({version: 'v4', auth});
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

🖇 داده ها را به برگه اضافه کنید

نمونه ای از اسناد در مورد نحوه الحاق داده ها به برگه
(روی تب Node.js کلیک کنید) به خوبی کار کرد. با این حال، نمی‌توانم بفهمم چگونه می‌توانم احراز هویت را از آنجا کار کنم. این نمونه زمانی کار کرد که ترفند بالا را برای افزودن دامنه‌های OAuth از دست رفته به اعتبارنامه‌های محیط برنامه‌نویس خود فهمیدم.

من چند تغییر ایجاد کردم تا استفاده مجدد آسان‌تر از کلاینت را فعال کنم، درخواست را به گونه‌ای متفاوت تنظیم کنم، و تاکید کنم که چگونه می‌خواهم داده‌ها توسط Sheets مدیریت شود.

کد من برای اضافه کردن داده ها به برگه، با استفاده از کد اولیه مشتری در بالا:

let client;

async function appendDataToSheet(spreadsheetId, tab, values) {
    if (!client) {
        client = sheetsClient();
    }

    try {
        const result = await client.spreadsheets.values.append({
            spreadsheetId,
            range: `${tab}!A2:AG`,
            // Use my data as provided.
            valueInputOption: 'RAW',
            // Inserts rows as part of appending to reduce overwrites.
            insertDataOption: 'INSERT_ROWS',
            requestBody: { values },
        });
        console.log(`${result.data.updates.updatedCells} cells appended.`);
    } catch(e) {
        // Show the error, do not stop. Cross-reference the error with terminal output
        // and decide case-by-case to re-run the script or manually copy data.
        console.error(e);
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من از “append” استفاده می کنم زیرا اسکریپت من معیارهای ماهانه را جمع آوری می کند و append به من امکان می دهد بدون حذف ردیف های قبلی ردیف های جدید اضافه کنم.

در اینجا مثالی از نحوه فراخوانی آمده است appendDataToSheet() تابع:

const values = [
  // Each nested array is a spreadsheet row.
  [1, 2, 3, 4, 'luggage'],
  [4, 5, 6, 'N/A', 'sticks'],
];
appendDataToSheet(
  'HPDkfqdu6rfIq5-4uTGDqz2tvmPxDZMul27JFexample',
  'Exported Data Tab',
  values
);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نکات خوبی در مورد کار با Sheets API در اسناد وجود دارد، مانند پیشنهاد عدم ارسال بیش از یک درخواست API در ثانیه در هر برگ. من راه سخت را فهمیدم: بازنویسی داده ها از درخواست اول با داده های درخواست دوم.

🚀 ارسال کنید!

اگر به سمت تولید این کار پیش بروم، ممکن است به استفاده از آن روی بیاورم
Cloud Scheduler و Cloud Run Jobs. اگر مایلید در مورد آن بخوانید به من اطلاع دهید.

عکس روی جلد توسط گلیب آلبوفسکی در Unsplash

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا