API呼出を最小限にして高速化!(GAS)
Google Apps Scriptでプログラムを組む際にやってはいけないことの1つに不要なAPIの呼び出しがあります。これをやってしまうとパフォーマンスを大きく下げたり、セキュリティーを下げるなどのデメリットがあります。今回はこの不要なAPIの呼び出しと解決方法について紹介します。下記内容のコードを見つけたら出来るだけ早めに改修してあげてください。
悪い例
const spreadsheetId = 'Spreadsheet_ID';
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
const sheet = spreadsheet.getSheetByName('sheet1');
function tooMuchApiCalls() {
let row = 1;
const column = 1;
const numRows = 1;
const numColumns = 1000;
const data = createData();
for (let i = 0; i < 1000; i++) {
const range = sheet.getRange(row, column, numRows, numColumns);
range.setValues([data[i]]);
row++;
}
}
function createData() {
const data = [];
for (let i = 0; i < 1000; i++) {
const array = [];
for (let j = 0; j < 1000; j++) {
array.push('test');
}
data.push(array);
}
return data;
}
// 22:39:48 お知らせ 実行開始
// 22:41:46 お知らせ 実行完了
// 開始から完了まで118秒
このコードの目的は1000列1000行の各セルに文字列「test」をセットすることです。注目すべき点は変数rowと関数getRangeです。
rowは初期値に1を代入しFor文を回るたびに+1されています。そのためrowの最小値は1で最大値は1000です。getRangeは(row, 1)から(row, 1000)までを取得しています。
無駄にAPIを呼び出さないためにデータ設定を一度に全て行います。
良い例
const spreadsheetId = 'Spreadsheet_ID';
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
const sheet = spreadsheet.getSheetByName('sheet1');
function properApiCalls() {
const row = 1;
const column = 1;
const numRows = 1000;
const numColumns = 1000;
const range = sheet.getRange(row, column, numRows, numColumns);
const data = createData();
range.setValues(data);
}
function createData() {
const data = [];
for (let i = 0; i < 1000; i++) {
const array = [];
for (let j = 0; j < 1000; j++) {
array.push('test');
}
data.push(array);
}
return data;
}
// 22:43:16 お知らせ 実行開始
// 22:45:07 お知らせ 実行完了
// 開始から完了まで111秒
こちらのコードはgetRangeで(1, 1)から(1000, 1000)までを取得し1度のAPI呼び出しでデータを設定しています。
今回の比較では約7秒の差でした。しかし1回ずつ実行しただけで平均値での差をとっていません。詳しく比較すればより精度の高い差が出るかもしれません。しかしこの検証から実行時間に差がある可能性があることがわかります。実際、Googleの公式ページでもベストプラクティスとして紹介されています。また私の実体験では不要なAPIの呼び出しにより5分以上かかっていた処理を改修し、1分以内に収めることに成功しました。
このように不要なAPIの呼び出しはパフォーマンスに大きく影響を与える要因になり得ます。見つけたらすぐに改修してあげてください。
他にもご要望などあればお気軽にコメントまたはContactからご連絡ください