GASでスプレッドシート内の大量データの中に対象となるデータが存在するかを検索する。
今回は、10,000行のデータの中から「golden-time」というデータを探す方法を2つ紹介。
①大量データの中から総当たりで検索
スプレッドシートの1行目から最終行目までをfor文で1つずつ確認する方法。
細かな解説は省きますが、for文を回すことでターゲットとなる文字列を探しています。
※例外処理やelse文は面倒くさいので書いていませんが、本来は処理として入れるべき
//---------- 特定の文字列を検索する関数 ----------
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;
}
}
// ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
}
②大量データの中から一気に検索
最初の部分は①と同じ定義です。簡単な解説は以下をご参照下さい。
-
大量データを一括取得
この時、getValues()で取得したデータは2次元配列になっているので、flat()で1次元化します。 -
indexOf()メソッドにより、ターゲットとなる文字列(今回の場合はgolden-time)が1.で取得した1次元配列の中に入っているかを確認します。
・文字が入っている場合は、配列の何番目に入っているかを返す
・文字が入っていない場合は、-1を返す
※true or falseで返したい場合はincludes()メソッドを使ってください
//---------- 特定の文字列を検索する関数 ----------
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は実行速度が遅い上に、実行時間に制限があるので注意が必要です。
数万行のデータを自動化処理する場合は、途中で処理が切れてしまわないようにコーディングをする必要があるので、本記事が参考になれば幸いです。