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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1472閲覧

【GAS】同一の投稿者からの添付ファイルを同一のフォルダに格納したい。

YousukeTanaka

総合スコア79

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/10/28 11:07

編集2020/10/28 11:20

やりたいこと

  • メールに添付されたファイルを取得して、自動的にGoogle Driveに格納したい。
  • その際、送り主の名前と取得日時で、フォルダが作成されるようにしたい。

イメージ:以下の通り、送り主と同一のタイトルでのやり取りで添付されたファイルが同一のフォルダに格納されるようにしたい。
イメージ説明

背景

WordPressサイトを通じて、顧客からきたお問い合わせメールがくるが、そこに見積もり添付がある。
最初のメールには顧客の名前があり、それを取得している。以下のコードで言えば「var customerName = content[3];」の部分。

問題点

実行の結果、ファイルごとにフォルダが作成されており、「同一の送り主、かつ 取得日付(これはまだ取得していない状況。後ほど行う予定)」でファイルがまとまっていない結果になっており、解決に時間がかかっています。

つまり、一つのフォルダに一つのファイルしか格納されておらず(逆に言えば、一つのファイルごとに一つのフォルダが作成さっれている状況)、実現したい一つのフォルダに複数のファイルが格納されている状態ではありません。どうしたら求める結果を実現できますか?

以下のように、一つのファイルと一つのフォルダが作成されている。
イメージ説明

問題となるコード(全体像)

function saveAttachments(){ //日付計算 var now = new Date(); var today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); var yesterday = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1); var strYesterday = Utilities.formatDate(yesterday, "JST", "yyyy/MM/dd"); let condition; condition = "subject:(【添付ファイルあり】)"; //未読 condition += " has:attachment"; //添付あり condition += " after:" + strYesterday; //今日(昨日より後) var search_mail = GmailApp.search(condition, 0, 10); var messeges = GmailApp.getMessagesForThreads(search_mail); var targetFolder = DriveApp.getFolderById('1DtKNZmd9SfELY-6UDiYcvD_48k-AGEz3'); for(var i = 0; i < messeges.length; i++) { //検索結果を一つずつ取り出す var body = messeges[i][0].getPlainBody(); var content = body.split("\n"); // body内の情報を取得 var customerName = content[3]; var newFolder = targetFolder.createFolder(customerName); for(var j = 0; j < messeges[i].length; j++) { //スレッドの場合ここを複数回実行 //添付ファイルを取得 var attach = messeges[i][j].getAttachments(); //添付ファイル取得の日付 var day = messeges[i][j].getDate(); //取り出したメールの日付を取得 var strDay = Utilities.formatDate(day , "JST", "yyyy_MM_dd"); //★★メールが今日以降か再度チェック if (day > yesterday){ //添付ファイルは複数あることが前提 for(var k = 0; k < attach.length; k++){ newFolder.createFile(attach[k]); var file = newFolder.getFilesByName(attach[k].getName()) var filename = strDay + '_' + attach[k].getName(); file.next().setName(filename); } } } } }

試したこと

やりたいことのイメージは、newFolderにpushメソッドを使って、fileを追加していくイメージです。
このイメージをもとに、pushメソッドを使って、色々試したのですが、結果できていない状況です。

アドバイスをお願いいたします。

参考URL

https://note.com/bets_inc/n/n222ac80b9cc6
https://blog.hikozaru.com/2019/01/GAS-Tips1.html

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

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

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

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

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

guest

回答1

0

ベストアンサー

スレッドごとのループ(外側の for ループ)で毎回 createFolder を呼んでいるから customerName が同じメールが来た時に同じ名前のフォルダが作成されるのではないでしょうか。既に同名のフォルダがあるか確認してから作成するかどうか判断すれば回避できると思います。

JavaScript

1function saveAttachments() { 2 //(省略) 3 var targetFolder = DriveApp.getFolderById("..."); 4 for (var i = 0; i < messeges.length; i++) { 5 //(省略) 6 7 // var newFolder = targetFolder.createFolder(customerName); 8 const iterator = targetFolder.getFoldersByName(customerName); 9 const newFolder = iterator.hasNext() 10 ? iterator.next() 11 : targetFolder.createFolder(customerName); 12 13 for (var j = 0; j < messeges[i].length; j++) { 14 //(省略) 15 } 16 } 17}

投稿2020/10/28 11:38

draq

総合スコア2577

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

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

YousukeTanaka

2020/10/28 11:45

解決できました。また、大変勉強になりました。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問