前提
Googleフォームを使用して依頼フォームを作成しているのですが、依頼を受領する側の作業効率アップのために
フォーム内容をスプレッドシートテンプレート①に抽出しPDF化したものと、
そのPDFとは別の用途で使用するスプレッドシートテンプレート②にフォームの回答の一部を抽出したもの、
のふたつを指定したひとつの宛先へ自動送信するGASを作成したいです。
実現したいこと
- フォーム内容の全回答をスプレッドシートテンプレート①に抽出してPDF化する
- フォーム内容の一部をスプレッドシートテンプレート②に抽出したスプレッドシートを作成する
- 作成したPDFとスプレッドシートを添付したメールを、フォーム送信時に指定の宛先へ送付する
発生している問題・エラーメッセージ
PDF化したものを添付して指定の宛先へ送付するコードは実装できたのですが、
複数の添付資料(PDFとスプレッドシート)を
ひとつの宛先に送付するにはどのようなコードにすればよいのかが分かりません。
エラーメッセージ
該当のソースコード
GAS
1//フォーム送信時にPDFを添付して指定宛先にメールを送信 2// FormApp.getActiveForm() 3function myFunction(event) { 4 5 //今日の日付 6 var request_date = new Date(); 7 8 // フォーム 9 var res = event.response.getItemResponses(); 10 11 var staff_name; 12 var cc_mailaddress; 13 var proposal_num; 14 var project_title; 15 var address; 16 var resuest_timing; 17//ほか項目多数(省略) 18 19 for (var n in res) { 20 var item = res[n]; 21 var name = item.getItem().getTitle(); 22 var value = item.getResponse(); 23 24 switch (name) { 25 case '担当': 26 staff_name = value; break; 27 case 'CC送付先(メールアドレス)': 28 cc_mailaddress = value; break; 29 case '番号': 30 proposal_num = value; break; 31 case '件名': 32 project_title = value; break; 33 case '住所': 34 address = value; break; 35 case '依頼タイミング': 36 resuest_timing = value; break; 37 //ほか項目多数(省略) 38 } 39 } 40 41 // スプレッドシートURLから抽出したIDを入力 42 var ssid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 43 var ss = SpreadsheetApp.openById(ssid); 44 45 var pdfss = ss.getSheetByName("【依頼シート】"); 46 var sheetid = ss.getActiveSheet().getSheetId(); 47 48 pdfss.getRange("U3").setValue(request_date); //依頼日 49 pdfss.getRange("C3").setValue(staff_name); //担当 50 pdfss.getRange("H3").setValue(cc_mailaddress); //CC送付先(メールアドレス) 51 pdfss.getRange("F5").setValue(proposal_num); //番号 52 pdfss.getRange("F9").setValue(project_title); //件名 53 pdfss.getRange("F10").setValue(address); //住所 54 pdfss.getRange("K5").setValue(resuest_timing); //依頼タイミング 55 //ほか項目多数(省略) 56 57 SpreadsheetApp.flush(); 58 59 // 以下PDF化コード(サイズ=A4) 60 61 var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid); 62 var url_ext = []; 63 64 var opts = { 65 format: "pdf", 66 size: "A4", 67 fzr: "false", 68 portrait: "true", 69 gridlines: "false", 70 printtitle: "false", 71 pagenumbers: "false", 72 fitw: "true", 73 sheetnames: "false", 74 gid: sheetid 75 }; 76 77 // 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納 78 for (optName in opts) { 79 url_ext.push(optName + "=" + opts[optName]); 80 } 81 82 // url_extの各要素を「&」で繋げる 83 var options = url_ext.join("&"); 84 Logger.log(options) 85 86 try { 87 // API使用のためのOAuth認証 88 var token = ScriptApp.getOAuthToken(); 89 90 var response = UrlFetchApp.fetch(url + options, { 91 headers: { 92 "Authorization": "Bearer " + token 93 } 94 }); 95 96 // ファイル名を作成「番号_件名(依頼タイミング)yyMMdd.pdf」 97 var fileName = proposal_num + "_" + project_title + "(" + resuest_timing + ")" + Utilities.formatDate(request_date, "JST", "yyMMdd"); 98 // Googleドライブ上のPDF格納先フォルダからIDを入力 99 var folder = DriveApp.getFolderById("yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"); 100 var fileBlob = response.getBlob().setName(fileName); 101 102 folder.createFile(fileBlob); 103 // メールアドレス 104 MailApp.sendEmail("abc@defg.jp", "【受付完了】" + proposal_num + "_" + project_title + "(担当:" + staff_name + ")", "---------------自動通知---------------\n" + "\n" + "依頼を受け付けましたのでご確認ください。\n" + "\n" + 105 Utilities.formatDate(request_date, "JST", "yyyy/MM/dd H:mm"), { 106 attachments : [fileBlob] 107 }); 108 109 } catch (e) { 110 Logger.log("ファイル生成に失敗しました" + e) 111 } 112}
GAS
1FormApp.getActiveForm(); 2 3// var targetFolderId = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" 4 5function renrakuhyo(e) { 6 7 // テンプレが格納されているフォルダを定義する 8 var folder = DriveApp.getRootFolder(); 9 var folderFiles = folder.getFiles(); 10 11 // テンプレートファイルIDを設定する 12 var fileId = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" 13 14 var staff_name = ""; // staff_name 15 var request_date = ""; // request_date 16 var proposal_num = ""; // proposal_num 17 var project_title = ""; // project_title 18//中略 19 var fin_num = ""; // fin_num 20 var results = ""; // 全結果 21 22 //フォームの回答データ部分を取得 // get data from the form 23 var itemResponses = e.response.getItemResponses(); 24 // store results and several keys 25 // 項目と回答を抽出する 26 var x = ""; // contents 27 var y = ""; // results 28 itemResponses.forEach(function(itemResponse){ 29 x = itemResponse.getItem().getTitle() 30 y = itemResponse.getResponse() 31 results += '【' + x + '】\n' 32 results += y + '\n\n' 33 if(x == "担当"){ 34 staff_name = y;} 35 else if (x == "依頼日"){ 36 request_date = y;} 37 else if (x == "番号"){ 38 proposal_num = y;} 39 else if (x == "件名"){ 40 project_title = y;} 41//中略 42 else if (x == "最終番号"){ 43 fin_num = y;} 44 }); 45 46 // スプレッドシートのコピーと更新 47 var date = new Date(); //ファイル名の日付部分作成 48 var formattedDate = Utilities.formatDate(date, "JST", "yyyy'年'MM'月'dd'日'"); 49 //コピー元のファイルを開く 50 var file = DriveApp.getFileById(fileId); 51 //コピーを作成,作成したコピーを参照 52 var newFile = file.makeCopy(proposal_num); 53 //コピーしたファイルをすぐに更新するため,IDを取得 54 var newid = newFile.getId(); 55 var spreadsheet = SpreadsheetApp.openById(newid) 56 57 //シートを取得する 58 var sheet = spreadsheet.getSheets()[0] ; 59 var textFinder = sheet.createTextFinder('input1'); 60 textFinder.replaceAllWith(staff_name); 61 var textFinder = sheet.createTextFinder('input2'); 62 textFinder.replaceAllWith(request_date); 63 var textFinder = sheet.createTextFinder('input3'); 64 textFinder.replaceAllWith(proposal_num); 65 var textFinder = sheet.createTextFinder('input4'); 66 textFinder.replaceAllWith(project_title); 67//中略 68 var textFinder = sheet.createTextFinder('input14'); 69 textFinder.replaceAllWith(fin_num); 70 71 // 変更内容を即反映 72 SpreadsheetApp.flush(); 73 74 // ファイルを開き直す 75// var newid = newFile.getId(); 76 var document = DriveApp.getFileById(newid) 77 var url = 'https://docs.google.com/document/d/'+newid 78 results += 'Your spreadsheet is created at ' + url; 79 80 // ファイル名を作成「番号_◯◯yyMMdd」 81 var fileName = proposal_num + "_" + "◯◯" + Utilities.formatDate(request_date, "JST", "yyMMdd"); 82 // Googleドライブ上のスプレッドシート格納先フォルダからIDを入力 83 var folder = DriveApp.getFolderById("vvvvvvvvvvvvvvvvvvvvvvvvvvvvv"); 84 var fileBlob = response.getBlob().setName(fileName); 85 86 folder.createFile(fileBlob); 87 88//このうしろにPDFの記述&さいごにメール本文??? 89 90}
試したこと
PDFを添付して送信するコードが完成したのですが、スプレッドシートテンプレート②にフォームの一部の項目を
反映させるコードを途中まで書いたのですがメール送信GASにどのように追加すれば良いのかがわかりません。
下記のサイトを参考にスプレッドシートテンプレート②用のコードを作成してみましたが、
PDF化したいわけではないのでつなげ方が分からず困っております。
■GoogleスプレッドシートからPDF生成とメール送信
https://qiita.com/yamadasuzaku/items/fdec0813c704a6a2784a
それとも同じフォームの回答を使用するので全く別のコードになるのでしょうか。
お力をお貸しください。よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。



回答1件
あなたの回答
tips
プレビュー