Cloud Functions TypeScript에서 GoogleSheets 데이터 가져오기 2019

일부러 관리 화면을 만드는 데 어려움 때문에 GoogleSheets로 끝내고 싶다는 것은 드물게 좋은 상황이라고 생각합니다.



같은 스프레드 시트로 관리되는 데이터를 원했습니다.

Google Sheets API를 이용하면 Cloud Functions에 한하지 않고 어디서나 무엇이든 액세스할 수 있습니다만, Cloud Functions등의 경우는 디폴트의 서비스 어카운트를 이용하는 것으로 조금 편하게 할 수 있습니다.

package.json
"dependencies": {
    ...,
    "googleapis": "^39.2.0",
}

GoogleSpreadSheets.ts
import * as gapis from 'googleapis';

export class GoogleSpreadSheets {

    private auth = async (): Promise<gapis.sheets_v4.Sheets> => {
        const client = await gapis.google.auth.getClient({
            scopes: ['https://www.googleapis.com/auth/spreadsheets.readonly']
        });
        return new gapis.sheets_v4.Sheets({ auth: client });
    }

    fetchValueRange = async (spreadsheetId: string, tabTitle: string): Promise<gapis.sheets_v4.Schema$ValueRange> => {
        const authed = await this.auth();
        const res = await authed.spreadsheets.values.get({ spreadsheetId: spreadsheetId, range: tabTitle });
        return res.data;
    }
}

spreadsheetId는 시트 URL에서
https://docs.google.com/spreadsheets/d/${spreadsheetId}/

의 부분에서, range에는 이번의 경우는 탭명을 지정하고 있습니다만 A1:B1라든지 그러한 서식을 사용할 수 있습니다. 여담입니다만 Google Sheets API를 사용하고 있으면, Sheets란 무엇인가 Sheet이란 무엇인가 같은 미궁에 막상됩니다.

그래서 API에서 반환되는 ValueRange

GoogleSheetData.ts
import * as entity from '../Entity';

export class GoogleSheetData {

    private sheet: google.sheets_v4.Schema$ValueRange;
    private rows: any[];

    constructor(sheet: google.sheets_v4.Schema$ValueRange) {
        this.sheet = sheet;
        // 先頭行を飛ばしてる
        this.rows = this.rowRange().slice(1).map(this.rowValuesAt);
    }

    toDogs = (): entity.Dog[] => {
        return this.rows.map(this.toDog).filter(utils.valueIsExist);
    }

    private toDog = (row: any[]): entity.Dog | undefined => {
        const data: entity.DogData = {
            name: row[0],
            race: row[1],
        };
        if (!entity.dataIsDogData(data)) {
            console.error('GoogleSheetData.toDog %O is not DogData', data);
            return undefined;
        }
        return new entity.Dog(data);
    }

    private rowValuesAt = (i: number): any[] => {
        if (this.sheet.values === undefined) {
            return [];
        }
        return this.sheet.values[i];
    }

    private rowCount = (): number => {
        if (this.sheet.values === undefined) {
            return 0;
        }
        return this.sheet.values.length;
    }

    private rowRange = (): number[] => {
        return this.range(this.rowCount());
    }

    private range = (l: number): number[] => {
        return Array.from({ length: l }, (v, i) => i);
    };

어쨌든 과 시트에서 대량의 개를 생성하는 코드가 있습니다. 에서 배포한 후 마지막으로 이 기능의 서비스 계정에 원하는 시트에 대한 액세스 권한을 부여해야 합니다.

에서 목적의 function의 상세를 표시하면 이용하고 있는 「서비스 어카운트」의 이름을 알 수 있다 에서

방금 확인한 서비스 계정 이름을 입력하고 초대하면 해당 시트에 대한 액세스 권한이 부여됩니다.


또한 권한 이전에 Google Sheets API 자체를
htps : // 이런. cぉd. 오, ぇ. 코 m / 아피 s / ぃ b 등 ry
에서 유효한 상태로 둘 필요가 있습니다.

유의점으로서 Google Sheets API는 적당히 리스폰스가 느리므로, 그것이 문제가 되는 것 같으면 하루에 한 번

좋은 웹페이지 즐겨찾기