Cloud Functions TypeScript에서 GoogleSheets 데이터 가져오기 2019
같은 스프레드 시트로 관리되는 데이터를 원했습니다.
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는 적당히 리스폰스가 느리므로, 그것이 문제가 되는 것 같으면 하루에 한 번
Reference
이 문제에 관하여(Cloud Functions TypeScript에서 GoogleSheets 데이터 가져오기 2019), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/oubakiou/items/456bb19615b897a987c9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)