みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptでフォーム送信メールからデータを取得してスプレッドシートにまとめるツールを作成しています。
前回の記事はコチラ。
Gmailから取得したメッセージIDをスプレッドシートに書き出す処理を使いました。
さて、なぜメッセージIDを取得したかというと、スクリプトを複数回実行したときに、同じメッセージから重複してデータを取得しないように…という目的がありました。
ですから、「同じメッセージIDが存在しなければ、そのメッセージのデータを書き出す」という分岐処理が必要になってきます。
で、その前準備として、メッセージIDが格納されている列データを配列として取得します。
スクリプトを高速にするために配列として取得した上で、上記分岐判定をしていくためです。
ということで、Google Apps Scriptでスプレッドシートの列データを配列として取得する方法についてお伝えします。
では、行ってみましょう!
今回のお題:スプレッドシートのメッセージIDの列データを配列で取得する
これまで例として使用してきたスプレッドシートはコチラです。
それで、Gmailからメッセージを取得してきたときに、それに含まれる名前、年齢とそのメッセージIDを記録するのですが、同じメッセージを重複してデータ追加しないようにしたいのです。
そのために、既に現在対象としているメッセージIDが、既にスプレッドシートに記載されているかどうかを判定する必要があります。
そしてその判定処理をするために、メッセージIDのデータをいったん配列として取り込む、というのが今回のお題です。
列データを配列として取得する
スプレッドシートで検索対象となるのは、C列ですから、C列の見出しを除くデータを配列として取り込みましょう。
GASにとって、実行時間は死活問題。
スプレッドシートのままよりも、配列に取り込んだほうが処理が高速になるのです。
そこで、getLastRowメソッドとgetRangeメソッドを組み合わせます。
getRangeメソッドによるセル範囲の取得
getRangeメソッドは当ブログでも何度か紹介していますが、以下の記述をすることで、特定の行番号、列番号のセルを基準にして、そこから指定した行数、列数のセル範囲を取得します。
行数、列数は省略することができ、省略した場合はそれぞれ1行、1列を指定したことと同様になります。
例えば、前述のシートであれば、以下のような命令にすれば、C列の見出しを除くセル範囲が取得ができます。
const range = sheet.getRange(2, 3, 2);
行番号2、列番号3のセルつまり「C2」セルから2行、1列分(省略時は1列になりますからね)のセル範囲の取得ということです。
getLastRowメソッドでシートのデータのある最終行番号を取得
行番号は、いつも2行で一定というわけではなく可変です。
そこで、getLastRowメソッドを使って、シート上にデータのある最終行の行番号を取得するようにします。
書き方はこうです。
これを使うと、先ほどのgetRangeメソッドの表現は以下のように書き換えることができます。
const range = sheet.getRange(2, 3, sheet.getLastRow() - 1);
今回の例では、データのある最終行数は3です。
ただ、見出し行を除きたいので、マイナス1をして、結果として2が行数の指定となるべき、ということです。
列データを配列として取得する
こうして取得した列データですが、getValuesメソッドを使えば、そのセル範囲内の値を配列として取得することができます。
これを使って、取得した配列の中身を見てみましょう。
スクリプトとしては以下のようになります。
const hasId = () => { const sheet = SpreadsheetApp.getActiveSheet(); const data = sheet.getRange(2, 3, sheet.getLastRow() - 1).getValues(); console.log(data); }
これを実行すると、ログには以下のように出力されます。
配列として取得ができました。
しかし、1列のデータなので、本当はできれば一次元配列になって欲しいのです…
というのも、一次元配列であれば特定の値を含むかどうかが簡単に判定できるからです。
しかし、getValuesで取得できるのは、二次元配列なのです。
ということで一工夫必要ですね。
まとめ
以上、Google Apps Scriptでスプレッドシートの列データを配列として取得する方法をお伝えしました。
- getRangeメソッドで、行番号、列番号、行数、列数を指定してセル範囲を取得する
- getLastRowメソッドで、シートのデータのある最終行番号を取得する
しかし、今回getValuesメソッドで取得した配列は二次元配列でした。
この二次元配列に特定のメッセージIDが含まれているかどうかを知る方法…次回お伝えしていきます。
どうぞお楽しみに!
連載目次:GASで正規表現を使ってデータを抽出&登録
正規表現を使うとGoogle Apps ScriptでメールやHTMLドキュメントからデータを抽出することができます。本シリーズでは、フォーム送信の通知メールからデータを抽出してスプレッドシートに追加するツールの作成を目指します。- Google Apps Scriptで正規表現を使って必要な情報を抽出する最も簡単なスクリプト
- Google Apps Scriptで正規表現でマッチした文字列から不要な部分を削除する
- Google Apps ScriptでGmailの受信メールから正規表現でデータを抽出する
- Google Apps Scriptでメールから正規表現で抽出したデータをスプレッドシートに蓄積する方法
- Google Apps ScriptでGmailのメッセージIDを取得する方法
- Google Apps Scriptでスプレッドシートの列データを配列として取得する方法
- GASで二次元配列に特定の要素が含まれているかを判定する方法
- GASでフォーム送信メールからデータを取得してスプレッドシートに蓄積するツールの完全版