8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

N高等学校 (1)Advent Calendar 2020

Day 8

GASで合計2600セルを検索したときにAPIリクエストの遅延がどれだけ発生するのか試してみた

Last updated at Posted at 2020-12-07

この記事は、N高等学校 (1) Advent Calendar 2020 8日目の記事です。

こんにちは、N高等学校2年のたっちです。

今回はGoogle Apps Scriptで、スプレッドシートのA1からZ100までの合計2600セルの検索時間が、
APIリクエストの回数でどれだけ遅くなるのか、はたまたAPIリクエストの回数を減らしたらどれほど速くなるのか、検証してみました。

はじめに

あくまでも、お遊びでやった実験です。正確な検証ではありません。

しかも超初心者なので、間違っている点があるかもしれません。
その際は、優しく指摘していただけますと幸いです。

検証方法

1c4a938c62aba5412047e75ba8c91c5e.png

スクリーンショット内に収まっていませんが、A1セルからZ100セルまでの100行×26列、セル一つひとつにA1形式の文字列を入力しました。

その中から、「Z100」という文字列を探し出すまでの時間を計測して、どれくらいの差が出るのか、試してみました。

検証用コード

この2つのコードを使用して検証しました。

セルを一つずつ取得(getValue)していく方法


function oneByOneCellGetSearch() {
  //スプレッドシート取得
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const mainSheet = spreadSheet.getSheetByName("シート1");

  //検索する値
  const searchValue = "Z100";

  //検索
  loop:
  for (var i = 1; i <= 100; i++) {
    for (var j = 1; j <= 26; j++) {
      //セルの値を取得
      var getCellValue = mainSheet.getRange(i, j).getValue();

      if (getCellValue === searchValue) {
        Logger.log(searchValue + "はありました");
        break loop;
      }
    }
  }
}

二次元配列(getValues)を使用する方法


function searchUsingTwoDimensionalArray() {
  //スプレッドシート取得
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const mainSheet = spreadSheet.getSheetByName("シート1");

  //検索する値
  const searchValue = "Z100";

  //A1からZ100までのセルを二次元配列で取得して一次元化
  const getCellValues = mainSheet.getRange(1, 1, 100, 26).getValues().flat();

  //検索
  if (!(getCellValues.indexOf(searchValue) == -1)) {
    Logger.log(searchValue + "はありました");
  }
}

結果

oneByOneCellGetSearch() time: 10277ms
searchUsingTwoDimensionalArray() time: 594ms


・セルを一つずつ取得(getValue)していく方法
10.277秒
・二次元配列(getValues)を使用する方法
0.594秒

10.277秒 - 0.594秒
= 9.683秒差

流石に、合計2600セルを読み込ませようとすると、見えやすい差が生まれました。
9秒もの差が出てくるとは予想していませんでしたが、実験が成功して良かったです。

時間計測に使用したコード


function logTime() {
  const label = 'myFunction() time'
  console.time(label); 
  myFunction();
  console.timeEnd(label);
}

参考にさせて頂いたサイト
GASのconsoleクラスのメソッドで実行時間をログ出力する方法

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?