「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)
}
}
}