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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

Q&A

解決済

1回答

3042閲覧

Googleフォームで送信されたPDFをメールで送信したい

10-mo

総合スコア21

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

0グッド

0クリップ

投稿2021/09/07 10:14

いつもご質問に対して、分かりやすいご回答いただきありがとうございます。

Googleフォームで送信された内容をスプレッドシートにまとめて、Gmailで送信するスクリプトを作っているのですが、どうしても思うようにいかない部分があります。
Googleフォームで送信された添付ファイルをメールで送信したいのですが、フォームで送信される添付ファイルは、どれも内容が異なります。また添付が無い場合もあります。
GoogleフォームではPDFの添付ファイルを送信が可能なのですが、送信されるファイルはどれも異なる内容です。単体のPDFファイルは前回のご回答で取れるのですが、新たに送信されたPDFは取得できません。これができれば完成するのですが、最後の最後につまづいております。どうかご教示いただけないでしょうか?よろしくお願いいたします。

・Googleフォームの添付ファイルは必須ではありません。
・グーグルフォームは最大で5つのファイル添付が可能です

コード function sendEmails() { var sheet = SpreadsheetApp.openById("1mJFc4VgiLm0E79D4tWmc1TYoOOkuhNdHbBQaMOeIGNA").getSheetByName("反映"); var EMAIL_SENT = "送信OK!"; var lastrow = sheet.getLastRow(); var lastcolumn = sheet.getLastColumn(); var dataRange = sheet.getRange(2, 2,lastrow-1,lastcolumn-1) var data = dataRange.getValues(); for (var i = 0; i < data.length; ++i) { var row = data[i]; var filename = sheet.getRange(i,5).getValue(); //ファイルの名前取る var emailAddress = row[0]; //B列 var message = row[2]; //D列 var emailSent = row[4]; //F列 var options = row[3];//E列 //オプションで添付ファイル(◯◯◯◯◯◯)を設定する。フォルダーではない var attachImg = DriveApp.getFilesByName(filename).next(); var options = { "attachments":attachImg, }; //「送信OK!」の場合は無視する if (row[4] === "送信OK!") { continue } if (emailSent != EMAIL_SENT) { var subject = row[1];//C列 MailApp.sendEmail(emailAddress, subject, message, options); sheet.getRange(2 + i,lastcolumn).setValue(EMAIL_SENT); SpreadsheetApp.flush(); } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

var options = row[3]; //E列

これだと、後半のoptionsと名前がかぶってしまうため、別の名前(たとえばuploads)に変えます。

var uploads = row[3]; //E列

フォームの回答からファイルをアップロードした場合、回答を集計しているスプレッドシート上では

https://drive.google.com/open?id=○○, https://drive.google.com/open?id=△△ (○○や△△はドライブ上のファイルのID)

というように、ファイルIDを含むURLを「カンマ+半角スペース」で区切った形式で表示されているはずです。

そこで、この文字列を「カンマ+半角スペース」で分割します。

js

1 var urls = uploads.split(', ')

そうするとurlsは、個別のURLの配列になります。

urls の内容:(個別のURLの配列) [ https://drive.google.com/open?id=○○, https://drive.google.com/open?id=△△ ]

次に、各URLから、ファイルIDを抜き出します。
具体的には「https://drive.google.com/open?id=」という文字列を空文字に置換して消します。

js

1 for (var url of urls) { 2 var fileId = url.replace('https://drive.google.com/open?id=',''); 3続く

あとは抜き出したファイルIDからファイル本体のBLOBを取得し、添付ファイルの配列に加えればokです。

ファイルを削除していたりして、getFileById()に存在しないファイルのIDを指定すると例外が発生するため
try~catch文で例外をキャッチするようにしています。

js

1続き 2 if (fileId) { 3 try { 4 // ファイルIDからblobを取得 5 var blob = DriveApp.getFileById(fileId).getBlob() 6 // 添付ファイルの配列に加える 7 attachments.push(blob); 8 } catch(err) { 9 Logger.log(`ファイル ID:${fileId} は存在しません。`) 10 } 11 } 12 13 var options = { 14 "attachments": attachments, 15 };

 
全体は下記のようになります。

js

1function sendEmails() { 2 var sheet = SpreadsheetApp.openById("1mJFc4VgiLm0E79D4tWmc1TYoOOkuhNdHbBQaMOeIGNA").getSheetByName("反映"); 3 var EMAIL_SENT = "送信OK!"; 4 var lastrow = sheet.getLastRow(); 5 var lastcolumn = sheet.getLastColumn(); 6 var dataRange = sheet.getRange(2, 2,lastrow-1,lastcolumn-1) 7 var data = dataRange.getValues(); 8 9 10 for (var i = 0; i < data.length; ++i) { 11 var row = data[i]; 12 var emailAddress = row[0]; //B列 13 var message = row[2]; //D列 14 var emailSent = row[4]; //F列 15 var uploads = row[3]; //E列 16 // F列が「送信OK!」の場合は無視する 17 if (row[4] === EMAIL_SENT) { 18 continue; 19 } 20 21 var attachments = []; // 添付ファイルを格納する配列 22 var urls = uploads.split(', '); 23 for (var url of urls) { 24 var fileId = url.replace('https://drive.google.com/open?id=',''); 25 if (fileId) { 26 try { 27 // ファイルIDからblobを取得 28 var blob = DriveApp.getFileById(fileId).getBlob(); 29 // 添付ファイルの配列に加える 30 attachments.push(blob); 31 } catch(err) { 32 Logger.log(`ファイル ID:${fileId} は存在しません。`); 33 } 34 } 35 } 36 //オプションで添付ファイルを設定する。 37 var options = { 38 "attachments": attachments, 39 }; 40 41 var subject = row[1]; //C列 42 MailApp.sendEmail(emailAddress, subject, message, options); 43 sheet.getRange(2 + i, lastcolumn).setValue(EMAIL_SENT); 44 SpreadsheetApp.flush(); 45 } 46}

投稿2021/09/07 15:51

編集2021/09/07 16:04
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

10-mo

2021/09/08 00:12

qnoirさん ご丁寧に分かりやすい解説も併せて記載いただきありがとうございます!!早速試してみたところ、すぐに実行できました! 本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問