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

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

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

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

Q&A

解決済

1回答

3234閲覧

GAS:特定フォルダ内のファイルを、一斉送信メールに添付したい

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

0グッド

1クリップ

投稿2021/10/13 03:07

前提・実現したいこと

GASで特定のフォルダに保存しているファイルを添付する方法として、
後述のアプローチを試みましたが構築しきれません。

最終目的:Google Workspaceを利用のグループ内アカウントで共有する、一斉送信ツールをつくりたい

STEP1:グループ内個々のアカウントでログイン
STEP2:共有する宛先リストにチェックを入れた宛先のみ送信する
STEP3:送信アカウント・情報は1のアカウントを利用
STEP4:特定の共有フォルダにファイルを保存するルールで運用し、添付ファイルは複数になる場合がある
STEP5:送信後、配信先リスト付で利用者にもメール。特定のスプレッドシートに利用ログを記載する。共有フォルダのファイルは削除する

当質問は「STEP4」の箇所です。

質問者のレベル:
皆さまのブログ、YoutubeなどでGASを独学。
ワードプレスサイトからカテゴリ別に記事を取得し、更新通知をHTML形式のメルマガとして
共有リスト宛に自動配信を実装しています。

発生している問題・エラーメッセージ

アプローチ1の場合・・・Utilities.zipでエラーになる。

Exception: The parameters (DriveApp.FileIterator,String) don't match the method signature for Utilities.zip.

アプローチ2の場合・・・特定フォルダ内のファイル数が 0 から不特定多数の場合、個々にgetBlobし、sendEmailメソッドでoption:[]のカッコ内に指定する方法がわかりません。

該当のソースコード

GAS

1 let attached_files = []; 2 let zantei_files = []; 3 const attached_folder = DriveApp.getFolderById('添付用の共有フォルダのID'); 4 const files = attached_folder.getFiles(); 5 while (files.hasNext()) { 6 const file = files.next(); 7 const file_ID = file.getId(); 8 zantei_files.push(file_ID); 9 } 10 11 if (zantei_files.length == 1) { 12 attached_files = DriveApp.getFileById(zantei_files[0]).getBlob(); 13 } else { 14 15 var filelist = attached_folder.getFiles(); 16 var zipman = Utilities.zip(filelist, 'test.zip'); 17 attached_folder.createFile(zipman).rename(title_text + '.zip');//圧縮ファイル名はメールの件名にする 18 attached_files = DriveApp.getFilesByName(title_text + '.zip'); 19 20 21 //上記の処理後、sendEmailメソッドのoptionで attachment : attached_files と指定するつもりです

試したこと

アプローチ1:対象ファイルが一つの場合はそのまま添付。複数の場合はZipファイル化する
アプローチ2:何個だろうとそのまま添付する
※第一希望は2です。

「GAS 添付 フォルダ メール」「GAS 圧縮 フォルダ」などGoogle・Youtube検索・閲覧をしましたが、解決しませんでした。

どうぞ、よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください

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

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

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

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

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

guest

回答1

0

ベストアンサー

2のアプローチですが、下記ではいかがでしょうか。

js

1function myFunction() { 2 let attached_files = []; 3 const attached_folder = DriveApp.getFolderById('添付用の共有フォルダのID'); 4 const files = attached_folder.getFiles(); 5 6 while (files.hasNext()) { 7 const file = files.next(); 8 try { 9 const blob = DriveApp.getFileById(file.getId()).getBlob(); 10 attached_files.push(blob); 11 Logger.log(file.getName() + 'を追加しました。'); 12 } catch(err) { 13 Logger.log(err.toString()); 14 } 15 } 16 17 const options = { 18 attachments: attached_files, 19 }; 20 21 MailApp.sendEmail('メールアドレス', '件名', '本文', options); 22}

アプローチ1は下記の形ではいかがでしょうか

js

1function myFunction2() { 2 let attached_files = []; 3 const attached_folder = DriveApp.getFolderById('添付用の共有フォルダのID'); 4 const files = attached_folder.getFiles(); 5 6 while (files.hasNext()) { 7 const file = files.next(); 8 try { 9 const blob = DriveApp.getFileById(file.getId()).getBlob(); 10 attached_files.push(blob); 11 Logger.log(file.getName() + 'を追加しました。'); 12 } catch(err) { 13 Logger.log(err.toString()); 14 } 15 } 16 17 const zipman = Utilities.zip(attached_files, 'test.zip'); 18 // 圧縮ファイル名はメールの件名にする 19 const attached_zipfile = attached_folder.createFile(zipman).setName(title_text + '.zip'); 20 const options = { 21 attachments: attached_zipfile, 22 }; 23 24 MailApp.sendEmail('メールアドレス', '件名', '本文', options); 25}

投稿2021/10/13 12:06

編集2021/10/13 12:23
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/10/14 13:14

早々にご教授いただき、ありがとうございます! アプローチ2、おかげさまで上手く行きました。 1はまだ試していませんが、2でBlobファイルをひとまとめに代入した attached_files をzipファイルに変換・リネームする、というやり方ですね? これに条件分岐でBlobファイルが一つの時にはそのまま、2つ以上ならzip化へ分岐させれば良いのかな、と読み取りました。 これでなんとかSTEP5に進めそうです。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問