0
0

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 1 year has passed since last update.

GASで効率良くサーチする方法

Last updated at Posted at 2021-09-05

GASでスプレッドシート内の大量データの中に対象となるデータが存在するかを検索する。
今回は、10,000行のデータの中から「golden-time」というデータを探す方法を2つ紹介。
image.png

①大量データの中から総当たりで検索

スプレッドシートの1行目から最終行目までをfor文で1つずつ確認する方法。
細かな解説は省きますが、for文を回すことでターゲットとなる文字列を探しています。
※例外処理やelse文は面倒くさいので書いていませんが、本来は処理として入れるべき

searchValue.gs
//---------- 特定の文字列を検索する関数 ----------
function searchValue() {
  // 現在のシートを取得
  const Sheet = SpreadsheetApp.getActiveSheet();
  // シートの最終行を定義
  const LastRow = Sheet.getLastRow() + 1;
  // ターゲット文字列を定義
  const Target = "golden-time";

  // ☆☆☆☆☆☆☆☆☆ 1つずつクローリング ☆☆☆☆☆☆☆☆☆
  let value = "";
  for (let i = 1; i < LastRow; i++) {
    value = Sheet.getRange(`A${i}`).getValue();
    if (value == Target) {
      Logger.log(`${Target}は${i}行目にあります`);
      break;
    }
  }
  // ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
}

②大量データの中から一気に検索

最初の部分は①と同じ定義です。簡単な解説は以下をご参照下さい。

  1. 大量データを一括取得
    この時、getValues()で取得したデータは2次元配列になっているので、flat()で1次元化します。

  2. indexOf()メソッドにより、ターゲットとなる文字列(今回の場合はgolden-time)が1.で取得した1次元配列の中に入っているかを確認します。
    ・文字が入っている場合は、配列の何番目に入っているかを返す
    ・文字が入っていない場合は、-1を返す
    ※true or falseで返したい場合はincludes()メソッドを使ってください

searchValue2.gs
//---------- 特定の文字列を検索する関数 ----------
function searchValue() {
  // 現在のシートを取得
  const Sheet = SpreadsheetApp.getActiveSheet();
  // シートの最終行を定義
  const LastRow = Sheet.getLastRow() + 1;
  // ターゲット文字列を定義
  const Target = "golden-time";

  // ################### 一気に検索 ###################
  const ValueArr = Sheet.getRange(`A1:A${LastRow}`).getValues().flat();
  const Index = ValueArr.indexOf(Target);
  if (Index != -1) {
    Logger.log(`${Target}は${Index + 1}行目にあります`);
  }
  // #################################################
}

実行速度比較

①と②の実行速度ですが、結論から申し上げますと②の方が断然早いです。
試しにそれぞれの検索方法で10回処理を行い平均値を出してみたところ、次のような結果になりました。
①:11983.3[ms] → 約11秒
②:187.3[ms] → 約0.2秒

もちろん実行環境により差異はありますが、②の方が10倍以上速く処理が終わります。

まとめ

GASは実行速度が遅い上に、実行時間に制限があるので注意が必要です。
数万行のデータを自動化処理する場合は、途中で処理が切れてしまわないようにコーディングをする必要があるので、本記事が参考になれば幸いです。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?