勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

GASを利用してGmailに届いたメール内容をGoogleスプレッドシートに記入する方法

  Google Apps Script Google

WordPressのContact Form7から送信した内容をGmailで受け取り「受信日時」「送信メールアドレス」「件名」「本文」をGoogleスプレッドシートに記入したい。Google Apps Scriptと連携させることで容易に対応できそう。以下に実装方法をメモ。

 

スプレッドシートの準備

以下のように1行目に項目名を追記しておく。

 

Contact Form7の準備

題名(メールの件名)を以下のように設定しておく。

【GASテスト】問い合わせ通知

尚、今回は実験も兼ねているのでContact Form7を利用しているが、PHPで作成したフォームの場合なども題名を分かりやすいものに設定しておくとよい。

 

GAS

ソースコード

function getMail(){

    //スプレッドシートの読み込み
    const sheet = SpreadsheetApp.getActiveSheet();

    //読み込んだシートの最終行を取得する
    const last = sheet.getLastRow();

    //シートが未記入の場合
    if( last == 1 ){

        //昨日分のタイムススタンプを取得
        var last_date = parseInt(((new Date()).getTime() - 1 * 60 * 60 * 1000) / 1000);
    }else{

        //最新データに+1したタイムスタンプを取得
        var last_date = new Date(sheet.getRange(`A${last}`).getValue());
        last_date = parseInt(last_date.getTime()) / 1000 + 1;
    }

    //件名を指定して検索
    const query = `after:${last_date} subject: 【GASテスト】問い合わせ通知`;

    //開始行
    const start = 0;

    //終了行
    const max = 10;

    //メールの検索
    const threads = GmailApp.search(query, start, max);

    const mail_data = [];

    //メールの取得
    const messagesForThreads = GmailApp.getMessagesForThreads(threads);

    for(const messages of messagesForThreads){
        const message = messages[0];
        const record = [
            message.getDate(),
            message.getFrom(),
            message.getSubject(),
            message.getPlainBody().slice(0,200)
        ];
        mail_data.push(record);
    }

    if(mail_data.length > 0){
        SpreadsheetApp.getActiveSheet().getRange((last + 1), 1, mail_data.length, mail_data[0].length).setValues(mail_data);
    }
}

解説等

検索条件部分

件名が「【GASテスト】問い合わせ通知」且つタイムスタンプを指定し検索している。

尚、リファレンスではafter / beforeは年月日指定のみ表記されており日時指定は表記されていないが、こちらのサイトによるとUNIXタイムスタンプで日時も指定できるとのこと。

注意点

以前にも書いたがsearch時の上限に気を付けること。

取得したデータを上の行に追記していきたい場合

上記のソースコードだと取得したデータはシートの下に追記されていく。これを逆にしたい(上の方に追記していきたい)場合は以下部分を変更すること。

#変更前
SpreadsheetApp.getActiveSheet().getRange((last + 1), 1, mail_data.length, mail_data[0].length).setValues(mail_data);

#変更後
SpreadsheetApp.getActiveSheet().insertRows(2, mail_data.length);
SpreadsheetApp.getActiveSheet().getRange(2, 1, mail_data.length, mail_data[0].length).setValues(mail_data);

insertRowsで更新データ分の行を2行目以降に挿入し、挿入した行にデータを書き込むという形。

 - Google Apps Script Google

  関連記事

GASを使ってみて感じたメリットとデメリット

Google Apps Scriptを色々勉強した中で感じたメリットとデメリット ...

GASで特定サイトをスクレイピングし、画像をGoogleドライブに保存

Google Apps Scriptで特定のサイトにスクレイピングし、画像が掲載 ...

GASとDrive APIを組み合わせて画像やPDFファイルをOCR処理する方法

Googleドライブに保存した画像やPDFファイルをOCR処理し、ファイル内のテ ...

GASで祝日一覧(年月日と祝日名)データをJSON出力するAPIを作成

PHPのシステム案件で祝日を取得し、処理を行う箇所があった。Googleカレンダ ...

GASを使って任天堂ホームページ更新情報のRSSを取得する方法

GASを使ってRSSを取得してみたい。今回はニンテンドーホームページ更新情報とい ...