
Google スプレッドシート: 選択肢データの一括取得
Google Sheets: Download Choice Data
この工程は、Google スプレッドシートから指定した2列に入っている選択肢データを取得します。
Basic Configs
- 工程名
- メモ
Configs for this Auto Step
- conf_OAuth2
- C1: OAuth2 設定 *
- conf_DataIdB
- C2: ダウンロード元のスプレッドシートの ID *
- conf_DataIdC
- C3: ダウンロード元のシートのタイトル *
- conf_DataIdD
- C4: 選択肢 ID の領域情報 (例 “A2:A”, “A:A”) *
- conf_DataIdE
- C5: 選択肢ラベルの領域情報 (例 “B2:B”, “B:B”) *
- conf_DataIdF
- C6: 選択肢 ID の一覧を保存するデータ項目 *
- conf_DataIdG
- C7: 選択肢ラベルの一覧を保存するデータ項目 *
Notes
- C4 および C5 では、一つの列中のセルの範囲を指定ください
- セル範囲の指定は、A1 表記(A1 参照スタイル)で行ってください(例:
A1:A4、A:A)- 詳しくは、Google Sheets ガイド『Google Sheets API の概要』の「A1 表記」セクションをご参照ください
- セル範囲の指定は、A1 表記(A1 参照スタイル)で行ってください(例:
- C4 で指定した領域と C5 で指定した領域の数が同じであること、領域の途中に空セルが無いことが前提となります
- スプレッドシートの ファイルID は、URL に含まれています https://docs.google.com/spreadsheets/d/SPREADSHEETID/edit#gid=0
Capture

See also
Script (click to open)
- 次のスクリプトが記述されている XML ファイルをダウンロードできます
- google-sheets-choice-batchget.xml (C) Questetra, Inc. (MIT License)
- Professional のワークフロー基盤では、ファイル内容を改変しオリジナルのアドオン自動工程として活用できます
// OAuth2 config
// Authorization Endpoint URL: https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force
// Token Endpoint URL: https://accounts.google.com/o/oauth2/token
// Scope: https://www.googleapis.com/auth/spreadsheets.readonly
// Consumer Key: (Get by Google Developers Console)
// Consumer Secret: (Get by Google Developers Console)
function main() {
//// == 工程コンフィグの参照 / Config Retrieving ==
const oauth = configs.getObject("conf_OAuth2");
const docId = retrieveStringData( "conf_DataIdB", "Spreadsheet ID" );
const sheet = retrieveStringData( "conf_DataIdC", "Spreadsheet Title" );
const rangeI = configs.get("conf_DataIdD");
const rangeL = configs.get("conf_DataIdE");
const idDataDef = configs.getObject("conf_DataIdF");
const labelDataDef = configs.getObject("conf_DataIdG");
//// == 演算 / Calculating ==
const { idList, labelList } = getChoice(oauth, docId, sheet, rangeI, rangeL);
//// == ワークフローデータへの代入 / Data Updating ==
engine.setData(idDataDef, idList.join("\n"));
engine.setData(labelDataDef, labelList.join("\n"));
}
/**
* 文字列データを config から読み出す。空であればエラー。
* @param {String} confName config 名
* @param {String} label エラーメッセージ用のラベル
* @return {String} string 文字列データ
*/
function retrieveStringData( confName, label ){
const dataDef = configs.getObject( confName );
let string;
if (dataDef !== null) {
string = engine.findData(dataDef);
} else {
string = configs.get(confName);
}
if (string === null || string === "") {
throw new Error(`${label} is empty.`);
}
return string;
}
/**
* Google スプレッドシートの選択肢データを取得
* @param {AuthSettingWrapper} oauth2 OAuth2 認証設定
* @param {String} docId スプレッドシートの ID
* @param {String} sheet シート名
* @param {String} rangeI 選択肢 ID の領域
* @param {String} rangeL 選択肢 ラベル の領域
* @return {Object} obj 選択肢データを格納したオブジェクト
* @return {Array<String>} obj.idList 選択肢 ID を格納した配列
* @return {Array<String>} obj.labelList 選択肢ラベルを格納した配列
*/
function getChoice(oauth, docId, sheet, rangeI, rangeL) {
// Method: spreadsheets.values.batchGet
const uri = `https://sheets.googleapis.com/v4/spreadsheets/${docId}/values/:batchGet`;
const response = httpClient.begin()
.authSetting(oauth)
.queryParam("ranges", `${sheet}!${rangeI}`)
.queryParam("ranges", `${sheet}!${rangeL}`)
.queryParam("valueRenderOption", "UNFORMATTED_VALUE")
.queryParam("dateTimeRenderOption", "FORMATTED_STRING")
.queryParam("majorDimension", "COLUMNS")
.get(uri);
const status = response.getStatusCode();
const responseStr = response.getResponseAsString();
if (status !== 200) {
const accessLog = `---GET request--- ${status}\n${responseStr}`;
engine.log(accessLog);
throw new Error(`Failed to get. status:${status}`);
}
const jsonObj = JSON.parse(responseStr);
const I_LABEL = "Choice-ID";
const L_LABEL = "Label";
const idCols = jsonObj.valueRanges[0].values;
const labelCols = jsonObj.valueRanges[1].values;
// error for empty column, multiple columns
checkCols(idCols, I_LABEL);
checkCols(labelCols, L_LABEL);
const idList = idCols[0];
const labelList = labelCols[0];
// error for different number of cells
if (idList.length !== labelList.length) {
throw new Error("Number of cells in two ranges is different.");
}
if (idList.length > 150000) {
throw new Error("Number of Choice Data is over 150,000.");
}
// error for an empty cells, over 1000 characters
checkData(idList, I_LABEL);
checkData(labelList, L_LABEL);
// error for same ids
const idSet = new Set(idList); // idList の重複確認用の Set
if (idSet.size !== idList.length) {
throw new Error(`Same ${I_LABEL}s are in range.`);
}
return { idList, labelList };
}
/**
* 列を確認し、空(undefined)や複数列ある場合はエラー
* @param {Array} cols 列データの配列
* @param {String} label エラー用のラベル
*/
function checkCols(cols, label) {
if (cols === undefined) {
throw new Error(`No Data in ${label}s range.`);
}
if (cols.length > 1) {
throw new Error(`Multiple Columns in ${label}s range.`);
}
}
/**
* 配列の要素を確認し、空文字や1000字以上のデータがあればエラー
* @param {Array<String>} list データが格納された配列
* @param {String} label エラー用のラベル
*/
function checkData(list, label) {
list.forEach(str => {
if (str === "") {
throw new Error(`Empty Cell is in ${label}s range.`);
}
if (str.length > 1000) {
throw new Error(`Over 1000-character ${label} is in range.`);
}
});
}