勉強したことのメモ

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とAdSense Management APIを使って前日分の売り上げをメール通知する方法

Googleアドセンスの売り上げをチェックする際、いつもはアドセンスの管理画面に ...

GASで特定サイトにログインした後にスクレイピングを行う方法

Google Apps Scriptの勉強として特定サイトにログインし、その後に ...

GASでNintendo Storeをチェックし指定したソフトが〇円以下の際に通知する方法

Google Apps Scriptを利用してNintendo Storeをスク ...

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

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

GASで「カクヨム」の更新状況をスクレイピングで取得する

Google Apps Scriptの勉強として「カクヨム」の指定した小説が更新 ...