GAS(プログラム)で請求書が添付されたGmailを取得

「GASでGmailを取得し、請求書の添付ファイルをDriveに保存しつつ、スプレッドシートに書き出す」を紹介!

目次

全体のコード

const spreadsheetId = 'スプレッドシートのIDをかく!';
// スプレッドシートのシート名を指定します
const sheetName = 'Gmail'; // シート名を適切に変更
// スプレッドシートを開く
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
// 指定したシートをアクティブにします
const sheet = spreadsheet.getSheetByName(sheetName);

function getGmail() {
  //現在時刻を取得
  const date = new Date()
  console.log("現在:", date) // ⇦ 確認用

  /*
  * getTime()でUNIXTIMEに変換
  * (UNIXTIMEとは、1970年1月1日00:00:00 UTC(協定世界時)からの経過秒数を表す方法です。)
  */
  const unixTime = date.getTime();
  console.log("UNIXTIME:", unixTime)

  /*
  * Math.floorのところでミリ秒を切り捨て秒までの時間にする
  */
  const now = Math.floor(unixTime / 1000);
  console.log(now)

  /*
  * now-3600で1時間前の時間を算出
  * 計算方法:60分 ✖︎ 60秒 = 3600
  * 1日前なら:24時間 ✖︎ 60分 ✖︎ 60秒 = 86400
  */
  const targetTime = now - 15552000;
  console.log(targetTime)

  //検索条件指定
  const query = "after:" + targetTime + " " + "from:(payments-noreply@google.com) OR from:(microsoft-noreply@microsoft.com) 請求書 has:attachment"
  const threads = GmailApp.search(query)
  
  // スレッドからメールを取得
  const targetMails = GmailApp.getMessagesForThreads(threads);
  console.log("targetMails", targetMails.length)

  let receivedDate
  let subject
  let url
  for (let i = 0; i < targetMails.length; i++) {
    for (let j = 0; j < targetMails[i].length; j++) {

      receivedDate = targetMails[i][j].getDate()
      subject = targetMails[i][j].getSubject()
      let attachments = targetMails[i][j].getAttachments();
      
      for (let k = 0; k < attachments.length; k++) {
        let createFile = DriveApp.getFolderById("フォルダIDをかく!").createFile(attachments[k]);
        url = createFile.getUrl()
      }

      let lastRow = sheet.getLastRow()
      sheet.getRange(lastRow + 1, 1).setValue(receivedDate)
      sheet.getRange(lastRow + 1, 2).setValue(subject)
      sheet.getRange(lastRow + 1, 3).setValue(url)
    }
  }
}

完成イメージ

(動画用に取得期間を半年に設定)

取得したメールを書き込む為のスプレッドシートを準備

Driveから「Googleスプレッドシート」をクリック!
スプレッドシートのファイル名を「Gmailから請求書取得」にしておきます。(ファイル名は任意で大丈夫です)

シートを追加して取得条件を考え、まとめる

シート1を「Gmail」、追加したシートを「取得条件」にしました。
シート名Gmailは同じにしてもらう方が無難です!

取得条件

  • 1時間毎に条件に合うメールを取得
  • Microsoft & Googleからの請求書が添付されたメール
  • メールタイトルに「請求書」の文字があるメール

あとで取得条件を確認するとき用に上記条件を「取得条件シート」に書いておきましょう!

スプレッドシートからGASのエディタ起動

メニューバーの「拡張機能 > Apps Script」を順にクリック!

GASエディタの表示確認

コード記述

関数名変更

今回は「getGmail」にします(任意)

function getGmail() {
  
}

現在時刻から1時間前の時間を算出

1時間前から現在時刻までのメールから探したいので1時間前の時間を算出

function getGmail() {
  //現在時刻を取得
  const date = new Date()
  console.log("現在:", date) // ⇦ 確認用

  /*
  * getTime()でUNIXTIMEに変換
  * (UNIXTIMEとは、1970年1月1日00:00:00 UTC(協定世界時)からの経過秒数を表す方法です。)
  */
  const unixTime = date.getTime();
  console.log("UNIXTIME:", unixTime)

  /*
  * Math.floorのところでミリ秒を切り捨て秒までの時間にする
  */
  const now = Math.floor(unixTime / 1000);
  console.log(now)

  /*
  * now-3600で1時間前の時間を算出
  * 計算方法:60分 ✖︎ 60秒 = 3600
  * 1日前なら:24時間 ✖︎ 60分 ✖︎ 60秒 = 86400
  */
  const targetTime = now - 3600; 
  console.log(targetTime)
  
}

実行して確認

ミリ秒が切り捨てられ、現在時刻より3600引かれた数値が出ているのでOK!

1時間以内のGmailを取得

const targetTime = now - 3600;
  console.log(targetTime)
ーーーーここから下を追記-------

  //検索条件指定
  const query = "after:" + targetTime
  const threads = GmailApp.search(query)
  
  // スレッドからメールを取得
  const targetMails = GmailApp.getMessagesForThreads(threads);
  // 何件取得できたか
  console.log("targetMails", targetMails.length)
------ここまで----------------

検索条件に、GoogleとMicrosoftのメールアドレスをセット + タイトルに「請求書」が入っている条件を追加。

条件がよくわからない場合は、Gmailを開いて、「検索オプション」を利用すると良いと思います!

 //検索条件指定
  const query = "after:" + targetTime + " " + "from:(payments-noreply@google.com) OR from:(microsoft-noreply@microsoft.com) 請求書 has:attachment"
  const threads = GmailApp.search(query)

添付ファイルを特定のGoogle Driveフォルダに格納

Google Driveにフォルダを作成して、フォルダIDをメモ。フォルダIDはあとでプログラム内に記述いたします!

スプレッドシートに、メール受信日時、タイトル、画像ファイルのURLを書き出し

スプレッドシートの情報を追記。これでスプレッドシートにアクセス可能になります!

-------ここから追記--------------
const spreadsheetId = '16KE_2LNl70-W4nWAksmHxD9MPJ4nmFJJlyhFF9RUPdw';
// スプレッドシートのシート名を指定します
const sheetName = 'Gmail'; // シート名を適切に変更
// スプレッドシートを開く
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
// 指定したシートをアクティブにします
const sheet = spreadsheet.getSheetByName(sheetName);

-------ここまで--------------
function getGmail() {
  //現在時刻を取得
  const date = new Date()
let receivedDate
  let subject
  let url
  for (let i = 0; i < targetMails.length; i++) {
    for (let j = 0; j < targetMails[i].length; j++) {
    
    // メール受信日を取得
      receivedDate = targetMails[i][j].getDate()
    // メールタイトルを取得
      subject = targetMails[i][j].getSubject()

    // 添付ファイルをフォルダに格納し、そのURLを取得
      let attachments = targetMails[i][j].getAttachments();
      for (let k = 0; k < attachments.length; k++) {
        let createFile = DriveApp.getFolderById("フォルダのIDを入れる!")
.createFile(attachments[k]);
        url = createFile.getUrl()
      }
    // スプレッドシートに書き込む
      let lastRow = sheet.getLastRow()
      sheet.getRange(lastRow + 1, 1).setValue(receivedDate)
      sheet.getRange(lastRow + 1, 2).setValue(subject)
      sheet.getRange(lastRow + 1, 3).setValue(url)
    }
  }

完成

もう一度全てのコード

const spreadsheetId = 'スプレッドシートのIDをかく!';
// スプレッドシートのシート名を指定します
const sheetName = 'Gmail'; // シート名を適切に変更
// スプレッドシートを開く
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
// 指定したシートをアクティブにします
const sheet = spreadsheet.getSheetByName(sheetName);

function getGmail() {
  //現在時刻を取得
  const date = new Date()
  console.log("現在:", date) // ⇦ 確認用

  /*
  * getTime()でUNIXTIMEに変換
  * (UNIXTIMEとは、1970年1月1日00:00:00 UTC(協定世界時)からの経過秒数を表す方法です。)
  */
  const unixTime = date.getTime();
  console.log("UNIXTIME:", unixTime)

  /*
  * Math.floorのところでミリ秒を切り捨て秒までの時間にする
  */
  const now = Math.floor(unixTime / 1000);
  console.log(now)

  /*
  * now-3600で1時間前の時間を算出
  * 計算方法:60分 ✖︎ 60秒 = 3600
  * 1日前なら:24時間 ✖︎ 60分 ✖︎ 60秒 = 86400
  */
  const targetTime = now - 15552000;
  console.log(targetTime)

  //検索条件指定
  const query = "after:" + targetTime + " " + "from:(payments-noreply@google.com) OR from:(microsoft-noreply@microsoft.com) 請求書 has:attachment"
  const threads = GmailApp.search(query)
  
  // スレッドからメールを取得
  const targetMails = GmailApp.getMessagesForThreads(threads);
  console.log("targetMails", targetMails.length)

  let receivedDate
  let subject
  let url
  for (let i = 0; i < targetMails.length; i++) {
    for (let j = 0; j < targetMails[i].length; j++) {

      receivedDate = targetMails[i][j].getDate()
      subject = targetMails[i][j].getSubject()
      let attachments = targetMails[i][j].getAttachments();
      
      for (let k = 0; k < attachments.length; k++) {
        let createFile = DriveApp.getFolderById("フォルダIDをかく!").createFile(attachments[k]);
        url = createFile.getUrl()
      }

      let lastRow = sheet.getLastRow()
      sheet.getRange(lastRow + 1, 1).setValue(receivedDate)
      sheet.getRange(lastRow + 1, 2).setValue(subject)
      sheet.getRange(lastRow + 1, 3).setValue(url)
    }
  }
}

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
目次