🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Q&A

1回答

731閲覧

GAS、Gmailを利用し<指定の文言>が含まれるメールに添付されているpdfを、指定の文言を付け加えた状態で格納したい

mdibievj09261

総合スコア12

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

0グッド

4クリップ

投稿2019/09/24 07:26

初心者です。
こちらで御質問する内容にそぐわなかったら申し訳ありません。。。。

前提・実現したいこと

① GASを利用
② Gmailを利用
③ <指定の文言を含む> (未読のもの限定)→ たとえば、Summary を含む 等
④ ③に該当するメールに添付されているpdfを指定のドライブに格納

ここまでの工程のスクリプト書きは成功したのですが、上記に以下の工程を追加したいです。

⑤該当のメール本文には必ず、
Order No,****************
という文言があるので、その文言を添付されているpdfの件名のおしりに付け加えた状態でドライブに格納したい。

(例えば)
・未読メールに添付されているpdfの件名: 2019.09.01_123456
・未読メール本文に記載されている文章(の一部): Order No,1234

ドライブに格納したい件名(pdfの件名)↓

2019.09.01_123456_Order No,1234
(のような形で - などで連結した状態で格納したい)

試したこと

自身が実現できたスクリプトは以下(①~④)となります。

function hasAttachment() {
var fol = DriveApp.getFolderById('●●●●●');
var thds = GmailApp.search('"Summary" has:attachment pdf', 0, 300);
var messe = GmailApp.getMessagesForThreads(thds);

for(var i = 0; i < messe.length; i++) {
for(var j = 0; j < messe[i].length; j++) {
if (messe[i][j].isUnread() === true) {
var attach = messe[i][j].getAttachments();
for(var k = 0; k < attach.length; k++){
fol.createFile(attach[k]);
}
}
}
}
}

これに、本文の 
Order No,****************
をpdf件名に付け加えて格納させるようにするにはどうすればいいのか、行き詰っています。。

ご教示頂けますと助かります。。。
宜しくお願い致します><

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

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

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

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

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

guest

回答1

0

こんにちは。
確認させていただきたいのですが、PDFの件名 は、添付のPDFファイルのファイル名でよいでしょうか?
それとも、PDFのファイル内の見出し1など、中身を見ないとわからないものでしょうか。

いったん、PDFファイルのファイル名、を前提に書いてみますね。

試していないのですが、createFileは2パターンあって、タイトル、mimetypeを指定しての場合と、今回のようにメールからgetAttachments()で添付ファイルを取り出し、createFile(blob) で登録の場合があります。

fol.createFile(attach[k]);

ここで attach[k] はBlobオブジェクトになります。

Blobオブジェクトのリファレンスを見ると、getName() で名前を取得、setName(xxxx)で名前を設定(再設定)できると思います。

https://developers.google.com/apps-script/reference/base/blob

以下、一部ですがこんな感じでできますでしょうか。

var blobFile = attach[k]; var originalName = blobFile.getName(); var newName = originalName + ここに追加したい文字列 ; blobFile.setName(newName); fol.createFile(blobFile);

追記

(コメントにも添えましたが追記します)
リネームはそこまで大変じゃなさそうなので、問題はメール本文からOrder No,************を抽出するところですね。

(1) 未読メールを配列で取得 -> (2) ループで1つずつメールをチェック -> (3) さらにメールに添付ファイルがあればそれをループで処理、という流れかと思います。

(2)のところで、メールのbodyに対してパターンマッチで番号を取得してあげるといいとは思います。

クラスメソッド様の記事が近いかもしれませんので貼っておきます。
https://dev.classmethod.jp/etc/google-app-script-gmail-filter/

試してないので、ほんとうに参考程度になりますが、こんなイメージです。

JavaScript

1// メールの1メッセージに対しての処理 2var body = message.getBody(); 3var OrdeNo = body.match(パターンマッチの文字列); 4 5var attach = message.getAttachments(); 6 7// 添付ファイルを扱う部分のループ 8for(var k = 0; k < attach.length; k++){ 9 var blobFile = attach[k]; 10 var originalName = blobFile.getName(); 11 var newName = originalName + OrdeNo; 12 blobFile.setName(newName); 13 14 fol.createFile(blobFile); 15} 16

パターンマッチの書き方はそんなに難しくないと思います。慣れないうちは、まず body.match(/Order No,1234/) みたいに、ちゃんとメール本文に存在するオーダー番号を直書きして、正しく抽出できるかチェックしながら進めるといいと思います。

投稿2019/09/25 00:22

編集2019/09/26 02:22
suama

総合スコア1997

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

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

mdibievj09261

2019/09/25 03:55

suama 様 ご教示有難うございます! 冒頭の御確認事項については、取得したいのは <PDFファイルのファイル名>で間違いありません。 pdfの件名を取得&再設定するステップはなんとなく理解できました! しかし、 その前のステップの ・本文から Order No,************ という行を探しだし、 ・(その)*****の部分を、newNameで結合させる という工程が組み立てられず。。。 for(var n in thds){ var thd = thds[n]; var msgs = thd.getMessages(); for(m in msgs){ var msg = msgs[m]; var bodys= body.replace('Order No,','') こんなようなものを加えるのかな、、と思うのですが。。。 解ればご教示頂けると幸いです。。。 基本的なことをお聞きしてしまい 本当に申し訳ありません。。。。><
suama

2019/09/25 05:16

> 本文からOrder No,************という行を探しだし なるほど、リネームはそこまで大変じゃなさそうなので、Order No,************を抽出するところなんですね、失礼しました。 パターンマッチで取得してあげるといいとは思うのですがどうでしょう。 なお、メッセージ(メール)も複数なのですね。 (GmailApp.getMessagesForThreads(thds); で配列) ちょっと思いついたら回答に追記させていただきますね。 クラスメソッド様の記事で、いったんgetMessagesForThreadsで取得したメッセージをループで回して、そこでさらにmessage.getBody()で本文を取得、本文に指定の文字列があるかパターンマッチさせている例があります。 このあたりに近い感じかなと考えています。 https://dev.classmethod.jp/etc/google-app-script-gmail-filter/ var OrdeNo = body.match(パターンマッチの文字列); で変数に入れれるかなと。
mdibievj09261

2019/09/30 04:00

suama様 追記有難うございます! 大変助かります。。。。>< 参考記事も拝見致します! ご教示頂いた追記も併せて 今一度熟考してみます! >ちょっと思いついたら回答に追記させていただきますね。 有難うございます! 本当に助かります。。。。><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問