GASで列データの配列に特定の値が含まれているかを判定するsomeメソッドの使い方


call

photo credit: Curtis Gregory Perry Off The Hook via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptでフォーム送信メールからデータを取得してスプレッドシートに登録していくツールを作成しています。

前回の記事はコチラ。

Google Apps Scriptでスプレッドシートの列データを配列として取得する方法
Google Apps Scriptでフォーム送信メールからデータを取得してスプレッドシートにまとめるツールを作成しています。今回はスプレッドシートの列データを配列として取得する方法についてお伝えします。

スプレッドシートの列データを配列として取得する方法についてお伝えしました。

というのも、対象のメッセージからデータを登録しようとしたときに、同じメッセージから何度も重複してデータを取得しないように、メッセージIDをキーにして重複を防ごうと思っているのですが、そのために既に記録しているメッセージIDを列ごとまとめて配列として確保した、というのが前回までの流れになります。

そして今回、その取得したメッセージIDの配列の中に、特定のメッセージIDが存在するかの判定をする方法を考えていきます。

JavaScriptの便利なsomeメソッドというのを使いますよ。

では、GASで配列に格納した列データの中に特定の値が含まれているか判定をするsomeメソッドの使い方です。

行ってみましょう!

スポンサーリンク

前回のおさらいと今回のお題

まず、題材としているスプレッドシートを紹介しますと、コチラです。

GASでメッセージIDをスプレッドシートに書き出す

このスプレッドシートのC列がメッセージIDの列になりますが、ここから見出しを除いた部分を配列に格納するスクリプトがコチラです。

function hasId() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getRange(2, 3, sheet.getLastRow() - 1).getValues();
  Logger.log(data);
}

これを実行すると、以下がログに出力されます。

[[15f9bc7d49a8a8ba], [15f9bc855917e91a]]

そう、二次元配列なんですね。

「要素がメッセージIDの1つで構成されている配列×行数分」の配列になっているんですね。

この中に特定のメッセージIDが存在するかどうかを判定するには、ひと工夫必要になります。

someメソッドで配列の要素が関数を満たすかを判定する

いくつか方法は考えられるのですが、今回はsomeメソッドを使ってみたいと思います。

someメソッドは、JavaScriptの組み込みのArrayオブジェクトのメンバーで、配列の要素の少なくとも一つが指定する関数を満たすかどうかを判定するメソッドです。

書き方はこうです。

配列.some(コールバック関数)

なんじゃこりゃ、って感じかも知れませんね…

someメソッドの使用例

先に、例を見ちゃいましょう。

コチラです。

function hasId() {
  var id = '15f9bc7d49a8a8ba'; //調べるメッセージID
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getRange(2, 3, sheet.getLastRow() - 1).getValues();
  var hasId = data.some(function(array, i, data) {
    return (array[0] === id);
  });
  Logger.log(hasId);
}

5行目から7行目がsomeメソッドを使っている部分になります。

コールバック関数とは

someメソッドの引数として与える関数は、コールバック関数と呼ばれるもので、配列内の各要素について呼び出される関数です。

someメソッドは、対象となる配列のすべての要素について、判定を行うメソッドです。それで、その各要素について処理を行う際に、以下の3つについて、用意した仮引数に格納されるのです。

  • インデックス
  • 元の配列

今回はそれぞれarray、i、dataという仮引数を用意していて、それぞれ格納されます。

例では、コールバック関数の中の処理は以下のようになっています。

return (array[0] === id);

つまり、取り出した要素の値array(今回は配列)の0番目のインデックスの要素の値が変数idの値と等しいかどうかを判定して、その結果をreturnという処理です。

someメソッドが返す値は

someメソッドは以下のルールに従って、ブール値を返します。

  • 全ての要素についてのreturnがfalseであれば、false
  • いずれか一つの要素のreturnがtrueであれば、true

を返すというわけです。

ですから、idと等しい値が含まれていればhasIdはtrueになります。

これを使えば、既にメッセージIDがスプレッドシートのC列に存在しているかどうかの判定が比較的簡単にできるようになりますね。

まとめ

以上、GASで列データの配列に特定の値が含まれているかを判定するsomeメソッドの使い方をお伝えしました。

  • コールバック関数とは何か
  • 配列のいずれかの要素がコールバック関数を満たすかを判定するsomeメソッド

Arrayオブジェクトには、someメソッドのようにコールバック関数を引数として与えて、全ての要素について何らかの処理を行うメソッドがいくつか存在していて、それらを反復メソッドといいます。

ちょっとややこしいですが、配列を扱う際にはかなり有効ですので、ぜひ身に着けてみてください。

次回は、今回までの内容を踏まえてツールを完成させていきたいと思います。

どうぞお楽しみに!

連載目次:GASで正規表現を使ってデータを抽出&登録

正規表現を使うとGoogle Apps ScriptでメールやHTMLドキュメントからデータを抽出することができます。本シリーズでは、フォーム送信の通知メールからデータを抽出してスプレッドシートに追加するツールの作成を目指します。
  1. Google Apps Scriptで正規表現を使って必要な情報を抽出する最も簡単なスクリプト
  2. Google Apps Scriptで正規表現でマッチした文字列から不要な部分を削除する
  3. Google Apps ScriptでGmailの受信メールから正規表現でデータを抽出する
  4. Google Apps Scriptでメールから正規表現で抽出したデータをスプレッドシートに蓄積する方法
  5. Google Apps ScriptでGmailのメッセージIDを取得する方法
  6. Google Apps Scriptでスプレッドシートの列データを配列として取得する方法
  7. GASで二次元配列に特定の要素が含まれているかを判定する方法
  8. GASでフォーム送信メールからデータを取得してスプレッドシートに蓄積するツールの完全版

タイトルとURLをコピーしました