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

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

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

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

Google フォーム

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

Gmail

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

Google Apps Script

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

解決済

GAS_Googleフォーム送信時に指定の宛先へ送信するメールにフォーム内容を抽出したPDFとスプレッドシートを添付したい

e-y
e-y

総合スコア3

Google スプレッドシート

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

Google フォーム

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

Gmail

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

Google Apps Script

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

1回答

0リアクション

0クリップ

535閲覧

投稿2022/09/03 09:59

編集2022/09/03 10:04

前提

Googleフォームを使用して依頼フォームを作成しているのですが、依頼を受領する側の作業効率アップのために
フォーム内容をスプレッドシートテンプレート①に抽出しPDF化したものと、
そのPDFとは別の用途で使用するスプレッドシートテンプレート②にフォームの回答の一部を抽出したもの、
のふたつを指定したひとつの宛先へ自動送信するGASを作成したいです。

実現したいこと

  • フォーム内容の全回答をスプレッドシートテンプレート①に抽出してPDF化する
  • フォーム内容の一部をスプレッドシートテンプレート②に抽出したスプレッドシートを作成する
  • 作成したPDFとスプレッドシートを添付したメールを、フォーム送信時に指定の宛先へ送付する

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

PDF化したものを添付して指定の宛先へ送付するコードは実装できたのですが、
複数の添付資料(PDFとスプレッドシート)を
ひとつの宛先に送付するにはどのようなコードにすればよいのかが分かりません。

エラーメッセージ

該当のソースコード

GAS

//フォーム送信時にPDFを添付して指定宛先にメールを送信 // FormApp.getActiveForm() function myFunction(event) { //今日の日付 var request_date = new Date(); // フォーム var res = event.response.getItemResponses(); var staff_name; var cc_mailaddress; var proposal_num; var project_title; var address; var resuest_timing; //ほか項目多数(省略) for (var n in res) { var item = res[n]; var name = item.getItem().getTitle(); var value = item.getResponse(); switch (name) { case '担当': staff_name = value; break; case 'CC送付先(メールアドレス)': cc_mailaddress = value; break; case '番号': proposal_num = value; break; case '件名': project_title = value; break; case '住所': address = value; break; case '依頼タイミング': resuest_timing = value; break;   //ほか項目多数(省略) } } // スプレッドシートURLから抽出したIDを入力 var ssid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; var ss = SpreadsheetApp.openById(ssid); var pdfss = ss.getSheetByName("【依頼シート】"); var sheetid = ss.getActiveSheet().getSheetId(); pdfss.getRange("U3").setValue(request_date); //依頼日 pdfss.getRange("C3").setValue(staff_name); //担当 pdfss.getRange("H3").setValue(cc_mailaddress); //CC送付先(メールアドレス) pdfss.getRange("F5").setValue(proposal_num); //番号 pdfss.getRange("F9").setValue(project_title); //件名 pdfss.getRange("F10").setValue(address); //住所 pdfss.getRange("K5").setValue(resuest_timing); //依頼タイミング  //ほか項目多数(省略) SpreadsheetApp.flush(); // 以下PDF化コード(サイズ=A4) var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid); var url_ext = []; var opts = { format: "pdf", size: "A4", fzr: "false", portrait: "true", gridlines: "false", printtitle: "false", pagenumbers: "false", fitw: "true", sheetnames: "false", gid: sheetid }; // 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納 for (optName in opts) { url_ext.push(optName + "=" + opts[optName]); } // url_extの各要素を「&」で繋げる var options = url_ext.join("&"); Logger.log(options) try { // API使用のためのOAuth認証 var token = ScriptApp.getOAuthToken(); var response = UrlFetchApp.fetch(url + options, { headers: { "Authorization": "Bearer " + token } }); // ファイル名を作成「番号_件名(依頼タイミング)yyMMdd.pdf」 var fileName = proposal_num + "_" + project_title + "(" + resuest_timing + ")" + Utilities.formatDate(request_date, "JST", "yyMMdd"); // Googleドライブ上のPDF格納先フォルダからIDを入力 var folder = DriveApp.getFolderById("yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"); var fileBlob = response.getBlob().setName(fileName); folder.createFile(fileBlob); // メールアドレス MailApp.sendEmail("abc@defg.jp", "【受付完了】" + proposal_num + "_" + project_title + "(担当:" + staff_name + ")", "---------------自動通知---------------\n" + "\n" + "依頼を受け付けましたのでご確認ください。\n" + "\n" + Utilities.formatDate(request_date, "JST", "yyyy/MM/dd H:mm"), { attachments : [fileBlob] }); } catch (e) { Logger.log("ファイル生成に失敗しました" + e) } }

GAS

FormApp.getActiveForm(); // var targetFolderId = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" function renrakuhyo(e) { // テンプレが格納されているフォルダを定義する var folder = DriveApp.getRootFolder(); var folderFiles = folder.getFiles(); // テンプレートファイルIDを設定する var fileId = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" var staff_name = ""; // staff_name var request_date = ""; // request_date var proposal_num = ""; // proposal_num var project_title = ""; // project_title //中略 var fin_num = ""; // fin_num var results = ""; // 全結果  //フォームの回答データ部分を取得 // get data from the form var itemResponses = e.response.getItemResponses(); // store results and several keys // 項目と回答を抽出する var x = ""; // contents var y = ""; // results itemResponses.forEach(function(itemResponse){ x = itemResponse.getItem().getTitle() y = itemResponse.getResponse() results += '【' + x + '】\n' results += y + '\n\n' if(x == "担当"){ staff_name = y;} else if (x == "依頼日"){ request_date = y;} else if (x == "番号"){ proposal_num = y;} else if (x == "件名"){ project_title = y;} //中略 else if (x == "最終番号"){ fin_num = y;} }); // スプレッドシートのコピーと更新 var date = new Date(); //ファイル名の日付部分作成 var formattedDate = Utilities.formatDate(date, "JST", "yyyy'年'MM'月'dd'日'"); //コピー元のファイルを開く var file = DriveApp.getFileById(fileId); //コピーを作成,作成したコピーを参照 var newFile = file.makeCopy(proposal_num); //コピーしたファイルをすぐに更新するため,IDを取得 var newid = newFile.getId();  var spreadsheet = SpreadsheetApp.openById(newid)  //シートを取得する var sheet = spreadsheet.getSheets()[0] ; var textFinder = sheet.createTextFinder('input1'); textFinder.replaceAllWith(staff_name); var textFinder = sheet.createTextFinder('input2'); textFinder.replaceAllWith(request_date); var textFinder = sheet.createTextFinder('input3'); textFinder.replaceAllWith(proposal_num); var textFinder = sheet.createTextFinder('input4'); textFinder.replaceAllWith(project_title); //中略 var textFinder = sheet.createTextFinder('input14'); textFinder.replaceAllWith(fin_num);  // 変更内容を即反映 SpreadsheetApp.flush(); // ファイルを開き直す // var newid = newFile.getId(); var document = DriveApp.getFileById(newid) var url = 'https://docs.google.com/document/d/'+newid results += 'Your spreadsheet is created at ' + url; // ファイル名を作成「番号_◯◯yyMMdd」 var fileName = proposal_num + "_" + "◯◯" + Utilities.formatDate(request_date, "JST", "yyMMdd"); // Googleドライブ上のスプレッドシート格納先フォルダからIDを入力 var folder = DriveApp.getFolderById("vvvvvvvvvvvvvvvvvvvvvvvvvvvvv"); var fileBlob = response.getBlob().setName(fileName); folder.createFile(fileBlob); //このうしろにPDFの記述&さいごにメール本文??? }

試したこと

PDFを添付して送信するコードが完成したのですが、スプレッドシートテンプレート②にフォームの一部の項目を
反映させるコードを途中まで書いたのですがメール送信GASにどのように追加すれば良いのかがわかりません。
下記のサイトを参考にスプレッドシートテンプレート②用のコードを作成してみましたが、
PDF化したいわけではないのでつなげ方が分からず困っております。
■GoogleスプレッドシートからPDF生成とメール送信
https://qiita.com/yamadasuzaku/items/fdec0813c704a6a2784a

それとも同じフォームの回答を使用するので全く別のコードになるのでしょうか。
お力をお貸しください。よろしくお願いいたします。

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

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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

e-y

2022/09/04 12:42 編集

回答いただいたスクリプトを参考に組合せてみましたがエラーで先に進めません。 保存しようとすると下記のようなエラーが出ます。 「構文エラー: SyntaxError: Identifier 'ssid2' has already been declared 行: 360 ファイル: 自動通知.gs」 おそらくPDF作成のところと被っているよと言われているのではないかと思いますが、どう直せば良いのかわかりません。 PDFだけ添付する場合は問題なく動作したのですが、その同じメールに同じフォームから回答を抽出したエクセルを添付するコードがうまく組み込めません。どこが間違えているのか教えていただけると幸いです。 ```GAS //フォーム送信時にPDFとスプシを添付して指定宛先にメールを送信 // FormApp.getActiveForm() function myFunction(event) { //今日の日付 var request_date = new Date(); // フォーム var res = event.response.getItemResponses(); var staff_name; var cc_mailaddress; var proposal_num; var project_title; var address; var resuest_timing; for (var n in res) { var item = res[n]; var name = item.getItem().getTitle(); var value = item.getResponse(); switch (name) { case '担当': staff_name = value; break; case 'CC送付先(メールアドレス)': cc_mailaddress = value; break; case '番号': proposal_num = value; break; case '件名': project_title = value; break; case '住所': address = value; break; case '依頼タイミング': resuest_timing = value; break; } } // スプレッドシートURLから抽出したIDを入力 var ssid1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; var ss = SpreadsheetApp.openById(ssid1);  // 変換元のスプレッドシート名(タブ名) var pdfss = ss.getSheetByName("【依頼】"); var sheetid = ss.getActiveSheet().getSheetId(); pdfss.getRange("U3").setValue(request_date); //依頼日 pdfss.getRange("C3").setValue(staff_name); //担当 pdfss.getRange("H3").setValue(cc_mailaddress); //CC送付先(メールアドレス) pdfss.getRange("F5").setValue(proposal_num); //番号 pdfss.getRange("F9").setValue(project_title); //件名 pdfss.getRange("F10").setValue(address); //住所 pdfss.getRange("K5").setValue(resuest_timing); //依頼タイミング SpreadsheetApp.flush(); // 以下PDF化コード(サイズ=A4) var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid); var url_ext = []; var opts = { format: "pdf", size: "A4", fzr: "false", portrait: "true", gridlines: "false", printtitle: "false", pagenumbers: "false", fitw: "true", sheetnames: "false", gid: sheetid }; // 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納 for (optName in opts) { url_ext.push(optName + "=" + opts[optName]); } // url_extの各要素を「&」で繋げる var options = url_ext.join("&"); Logger.log(options) try { // API使用のためのOAuth認証 var token = ScriptApp.getOAuthToken(); var response = UrlFetchApp.fetch(url + options, { headers: { "Authorization": "Bearer " + token } }); // ファイル名を作成「番号_依頼(依頼タイミング)yyMMdd.pdf」 var fileName = proposal_num + "_" + project_title + "(" + resuest_timing + ")" + Utilities.formatDate(request_date, "JST", "yyMMdd"); // Googleドライブ上のPDF格納先フォルダからIDを入力 var folder = DriveApp.getFolderById("yyyyyyyyyyyyyyyyyyyyyyyyyyyyy"); const pdf = response.getBlob().setName(pdfName); folder.createFile(pdf); // メールアドレス MailApp.sendEmail("abc@def.jp", "【新規依頼】" + proposal_num + "_" + project_title + "(担当:" + staff_name + ")", "---------------自動通知---------------\n" + "\n" + "新規依頼を受け付けました。\n" + "エクセルファイルは必要に応じてダウンロードしてください。\n" + "\n" + Utilities.formatDate(request_date, "JST", "yyyy/MM/dd H:mm"), { attachments : [pdf,excel] }); } catch (e) { Logger.log("ファイル生成に失敗しました" + e) } } //以下はエクセルファイル作成用 // ssid2;スプレッドシートID、 // sheetname2;シート名 // filename2;保存するファイル名 function getExcel(ssid2, sheetname2, filename2) { const ssid2 = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'; const sheetname2 = 'フォーマット'; // 変換元のシート名(タブ名) const filename2 = proposal_num + "_" + "ファイル名" + "_" + Utilities.formatDate(request_date, "JST", "yyMMdd"); const url2 = 'https://docs.google.com/spreadsheets/d/' + ssid2 + '/export?format=xlsx&gid=' + sheetid2; const option = { "headers" : { Authorization: "Bearer " + ScriptApp.getOAuthToken() }, "muteHttpExceptions" : true }; const blob = UrlFetchApp.fetch(url2, option).getBlob().setName(filename2); return blob;  //シートを取得する var textFinder = sheet.createTextFinder('input1'); textFinder.replaceAllWith(staff_name); var textFinder = sheet.createTextFinder('input2'); textFinder.replaceAllWith(request_date); var textFinder = sheet.createTextFinder('input3'); textFinder.replaceAllWith(proposal_num); var textFinder = sheet.createTextFinder('input4'); textFinder.replaceAllWith(project_title); } ```
qnoir

2022/09/06 11:17

回答を書いていますのでしばらくお待ち下さい。 (回答に対するコメントは、この欄=元質問のコメント欄ではなく回答の下にあるコメント欄に書いていただけますと助かります。質問の方にコメントが書かれても回答者には通知が来ません。回答の方にコメントがあれば、回答者に通知が来てコメントされたことがすぐわかります。お手数ですがよろしくお願いします。)
qnoir

2022/09/06 13:09

回答欄に追記しました。

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google スプレッドシート

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

Google フォーム

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

Gmail

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

Google Apps Script

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