質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

1118閲覧

gasを使って条件に合ったgmailの内容をgooglespreadsheetにyyyy/MM/dd/mm/hhの書式で書き出したい。

HYoshitaka

総合スコア14

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2021/02/04 05:26

編集2021/02/04 08:21

gmailからスプレッドシートに条件に合ったメールを取得し、yyyy/MM/dd/hh/mmの書式にしたいのですが、yyyy/MM/ddの書式になってしまいます。
可能ならgmailをでメールを受信した日時をgooglespreadsheetに書き出したいのですが、苦戦しています。
どなたかわかる方教えていただけますでしょうか?

【試したこと】spreadsheetのセルの書式を日付⇒日時に変更しましたが、添付ファイルのような日時になり、メールの受信時間とはことなる時間になってしまいます。

gas

1 2// 設定情報 3function getConfig() { 4 return { 5 6 spreadSheetId: 'ID',// スプレッドシートの ID 7 spreadSheetTabName: 'シート1',// スプレッドシートのタブ名 8 searchText:"メンバー" // Gmail の検索ワード 9 }; 10} 11 12function isBussinessDay(date){ 13 //0が日曜、6が土曜 14 if(date.getDay() == 0 || date.getDay() == 6){ 15 return false; 16 } 17 const calendar_ID ='ja.japanese#holiday@group.v.calendar.google.com'; 18 const calendar_JA =CalendarApp.getCalendarById(calendar_ID); 19 const todayEvent = calendar_JA.getEventsForDay(date); 20 if(todayEvent.length > 0){ 21 return false; 22 } 23 return true; 24} 25// 実行関数 26function main() { 27 //指定日の日付をdateとして入力 28 let spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 29 let sheet = spreadsheet.getActiveSheet(); 30 let range = sheet.getRange("J2"); 31 let value = range.getValue(); 32 let date = value; 33 let business_flg =false; 34 35 //指定した日付を取得 36 let dateBefore = new Date(date.getFullYear(),date.getMonth(),date.getDate()+1,date.getHours(),date.getMinutes()); 37 let timeStampBefore = Utilities.formatDate(dateBefore, 'Asia/Tokyo', 'yyyy/MM/dd'); 38 let timeStampAfter = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd'); 39 Logger.log(timeStampBefore); 40 41 const config = getConfig(); 42 const SEARCH_BOX = `subject:${config.searchText} before:${timeStampBefore} after:${timeStampAfter}`; // before:取得したい日にちの次の日 after:取得したい日にち 43 /* スプレッドシートのシートを取得と準備 */ 44 const mySheet = SpreadsheetApp.openById(config.spreadSheetId).getSheetByName(config.spreadSheetTabName); //シートを取得 45 let messages = [['date','Subject', 'From', 'To','Body']]; 46 GmailApp 47 .search(SEARCH_BOX, 0, 500) 48 49 .forEach(function (thread) { 50 thread.getMessages().forEach(function (message) { 51 let date = message.getDate(); 52 let subject = message.getSubject(); 53 let to = message.getTo(); 54 let from = message.getFrom(); 55 let plainBody = message.getPlainBody().slice(0,100); 56 messages.push([date,subject, from, to,plainBody]); 57 58 }); 59 Logger.log(date); 60 }); 61 if (messages.length === 1) return; 62 mySheet.getRange('A1:E' + messages.length ).setValues(messages); 63}

結果
イメージ説明

セルの書式を変更した場合
イメージ説明

ログの内容イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sawa

2021/02/04 06:41 編集

Logger.log(date) はどういう結果が出てますか? あと、いらんツッコミかもですが、 "yyyy/MM/dd/mm/hh" ってのは変です。 "yyyy/MM/dd/hh/mm" ですよね?
HYoshitaka

2021/02/04 08:22

ログの内容を追記しましたので内容ご確認ください。
sawa

2021/02/04 11:59

ログのdateは最初に取得してるvalueの日付ですね。 Logger.log(date); をループ内に入れてあげると、メールの日時をdateとして取得できるはずなので、そのログを確認ください。
guest

回答2

0

修正後のコード

gas

1// 設定情報 2function getConfig() { 3 return { 4 5 spreadSheetId: 'ID',// スプレッドシートの ID 6 spreadSheetTabName: 'シート1',// スプレッドシートのタブ名 7 searchText:"メンバー" // Gmail の検索ワード 8 }; 9} 10 11function isBussinessDay(date){ 12 //0が日曜、6が土曜 13 if(date.getDay() == 0 || date.getDay() == 6){ 14 return false; 15 } 16 const calendar_ID ='ja.japanese#holiday@group.v.calendar.google.com'; 17 const calendar_JA =CalendarApp.getCalendarById(calendar_ID); 18 const todayEvent = calendar_JA.getEventsForDay(date); 19 if(todayEvent.length > 0){ 20 return false; 21 } 22 return true; 23} 24// 実行関数 25function main() { 26 //指定日の日付をdateとして入力 27 let spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 28 let sheet = spreadsheet.getActiveSheet(); 29 let range = sheet.getRange("J2"); 30 let value = range.getValue(); 31 let date = value; 32 let business_flg =false; 33 34 //指定した日付を取得 35 let dateBefore = new Date(date.getFullYear(),date.getMonth(),date.getDate()+1,date.getHours(),date.getMinutes()); 36 let timeStampBefore = Utilities.formatDate(dateBefore, 'Asia/Tokyo', 'yyyy/MM/dd'); 37 let timeStampAfter = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd'); 38 Logger.log(timeStampBefore); 39 40 const config = getConfig(); 41 const SEARCH_BOX = `subject:${config.searchText} before:${timeStampBefore} after:${timeStampAfter}`; // before:取得したい日にちの次の日 after:取得したい日にち 42 /* スプレッドシートのシートを取得と準備 */ 43 const mySheet = SpreadsheetApp.openById(config.spreadSheetId).getSheetByName(config.spreadSheetTabName); //シートを取得 44 let messages = [['date','Subject', 'From', 'To','Body']]; 45 GmailApp 46 .search(SEARCH_BOX, 0, 500) 47 48 .forEach(function (thread) { 49 thread.getMessages().forEach(function (message) { 50 let date = message.getDate(); 51 **let reformDate = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd/HH:mm');** 52 let subject = message.getSubject(); 53 let to = message.getTo(); 54 let from = message.getFrom(); 55 let plainBody = message.getPlainBody().slice(0,100); 56 messages.push([reformdate,subject, from, to,plainBody]); 57 58 }); 59 Logger.log(date); 60 Logger.log(reformDate); 61 }); 62 if (messages.length === 1) return; 63 mySheet.getRange('A1:E' + messages.length ).setValues(messages); 64} 65

ログイメージ説明
結果
イメージ説明

投稿2021/02/04 12:50

HYoshitaka

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ここのフォーマット指定に時間が入っていないからでは
Utilities.formatDate
実行日時の指定だけでしたね。
見当違い、失礼しました。


さらに回答

let date = message.getDate();

このdateをフォーマットせずにmessagesにいれているからでは?
他の部分のように、

Utilities.formatDate

にて、日時分をフォーマット指定して利用してみてはいかがでしょうか?

投稿2021/02/04 11:47

編集2021/02/04 12:04
WhiteTempest

総合スコア404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HYoshitaka

2021/02/04 12:43

ご回答ありがとうございます。 ご指摘の通りでした。 コードを修正したら、期待通りの結果が得られました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問