見出し画像

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 公式アカウントです。
漫画(まんが)・コミックの新刊情報を毎日配信中!

コーヒーブレイク

時代はアプリ? いやいや、電子工作でしょ! 女子大生の向阪晴(さきさかはる)が得意の電子工作を駆使してあれやこれやを一気に解決!?

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?