GAS|スプレッドシートのシート内へ全データを入力する(高速)|setValues|getRange|Sheet|SpreadsheetApp|Google Apps Script|開発裏話
「マンガポスト日本版」では、Google ドライブ内に保存している「コミックス発売日情報」を参照して、その日付を基に毎日自動配信(ツイート)しています。
この「コミックス販売日情報」は、スプレッドシートで作ったものです。
Google ドライブ内に保存しているスプレッドシートの、特定のシート内へ全データを入力するには、以下のようにします。但し、これでは速度の問題があります。
/**
* Sets a rectangular grid of values.
*
* @param sheet — the Sheet object
* @param values — a two-dimensional array of values
*/
function setAllValues(sheet, values) {
for (var i = 0; i < values.length; i++) {
// get row
var row = values[i];
for (var j = 0; j < row.length; j++) {
// get column
var column = row[j];
sheet.getRange((i + 1), (j + 1)).setValue(column);
}
}
}
上記は、for 文の繰り返し処理によって、セルに対してデータをひとつずつ入力しています。
GAS に於いて、速度とAPIのコール回数は比例します。つまり、ひとつずつ入力すればするほど、時間が蓄積されてしまいます。
ですので、最も高速に全データを入力するには、全データが入力される範囲を一度に指定する必要があります。全データの入力をたった一度で済ませるのです。
/**
* Sets a rectangular grid of values.
*
* @param sheet — the Sheet object
* @param values — a two-dimensional array of values
* @return Range — this range, for chaining
*/
function setAllValues(sheet, values) {
var numRows = values.length;
var numColumns = values[0].length;
return sheet.getRange(1, 1, numRows, numColumns).setValues(values);
}
上記の通り、非常に単純な実装になりました。そして、高速です。
実際、前者では 100ms の時間を有していた処理が、後者では僅か 4ms に短縮されました。
マンガポスト日本版
マンガポスト日本版の Twitter 公式アカウントです。
漫画(まんが)・コミックの新刊情報を毎日配信中!
コーヒーブレイク
時代はアプリ? いやいや、電子工作でしょ! 女子大生の向阪晴(さきさかはる)が得意の電子工作を駆使してあれやこれやを一気に解決!?