
前提
Googleフォームを依頼フォームとして利用することになりました。
依頼を受けた者が、作業時にフォームの内容を確認しながら作業するため、1行で吐き出されたスプレッドシートではなく、
A4用紙1枚に見やすく配置されたフォーマットにフォームの回答を抽出してPDF化し、
そのPDFを添付した通知メールを指定のメールアドレス宛に送りたいです。
・フォーム入力と同時に入力者とCCに自動通知
・PDFを添付したメールを指定メールアドレスへ送付
というのは実現できたのですが、フォームと連携したスプレッドシート(データ蓄積用)とは別に、フォーム送信時に新規依頼内容を
規定のフォーマットに項目ごとにセルを指定して反映させ、その反映済みスプレッドシートをPDF化して指定の宛先へメールしたいのですが、
どうしても方法が見つかりません。
GASは初心者ですので、なるべく初心者でも分かるようにご教授いただけると幸いです。
実現したいこと
- フォームが入力されたときに、入力者への通知とは別の内容の通知メール(PDF付き)を送付したい
- PDFの内容はフォームの全項目・・・A4縦1枚で全項目が確認できる加工済テンプレート(スプレッドシート)あり
- フォームが送信されたら「入力者とCC宛先」および「指定の宛先」へタイムリーに自動通知が飛ぶようにしたい
- フォームと連携しているスプレッドシートは生データとして触らない仕様としたい
発生している問題・エラーメッセージ
入力者への自動通知メールはフォームのエディタにスクリプトを書いて問題なく実装済みです。
指定の宛先に送りたいメールについて、どこに(フォーム?スプレッドシート?)どのようにコードを書けばよいのか(入力者への自動通知メールとおなじスクリプト内に書けるのか?新たにスクリプトを作成するべきか?その場合のトリガーはスクリプトごとに必要なのか?)わからない状況です。
下記アドレスのコードを参考におなじようにフォームのエディタに書いてみましたが動作しません。
■GoogleフォームからPDF作成しメール送信
https://imabari.hateblo.jp/entry/2018/10/25/225825
エラーメッセージ
該当のソースコード
GAS
1// FormApp.getActiveForm() 2function myFunction(event) { 3 4 //今日の日付 5 var request_date = new Date(); 6 7 // フォーム 8 var res = event.response.getItemResponses(); 9 10 var staff_name; 11 var cc_mailaddress; 12 var proposal_num; 13 var project_title; 14 var address; 15 var resuest_timing; 16 //項目は全部で67項目あります 17 18 for (var n in res) { 19 var item = res[n]; 20 var name = item.getItem().getTitle(); 21 var value = item.getResponse(); 22 23 switch (name) { 24 case '担当': 25 staff_name = value; break; 26 case 'CC宛先メールアドレス': 27 cc_mailaddress = value; break; 28 case '番号': 29 proposal_num = value; break; 30 case '依頼タイトル': 31 project_title = value; break; 32 case '住所': 33 address = value; break; 34 case '依頼タイミング': 35 resuest_timing = value; break; 36 //項目は全部で67項目あります 37 38 } 39 } 40 41 // スプレッドシートURLから抽出したIDを入力 42 var ssid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 43 var ss = SpreadsheetApp.openById(ssid); 44 45 var pdfss = ss.getSheetByName("依頼票PDF"); 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("J5").setValue(resuest_timing); //依頼タイミング 55 //項目は全部で67項目あります 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 // ファイル名を作成「依頼票_番号.pdf」 97 var fileName = proposal_num + "_" + project_title + "(" + resuest_timing + ")" + request_date; 98 // Googleドライブ上のPDF格納先フォルダからIDを入力 99 var folder = DriveApp.getFolderById("yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"); 100 var fileBlob = response.getBlob().setName(fileName); 101 102 folder.createFile(fileBlob); 103 // メールアドレス 104 MailApp.sendEmail("eeeeeeeeeeeeee@yy.jp", "【新規依頼受付】", "新規依頼を受付ました。詳細は添付のPDFをご確認ください。", { 105 attachments : [fileBlob] 106 }); 107 108 } catch (e) { 109 Logger.log("ファイル生成に失敗しました" + e) 110 } 111}
GAS
1//【試したこと】ドライブのPDF用フォルダに置いてあるPDFを添付してメールを送るコード 2function sendMail(){ 3 4 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 5 var key = spreadsheet.getId(); 6 var sheetName = spreadsheet.getSheetByName("【依頼票】"); 7 var gid = sheetName.getSheetId(); 8 var token = ScriptApp.getOAuthToken(); 9 10 var url = "https://docs.google.com/spreadsheets/d/" + key + "/export?gid=" + gid + "&format=pdf&portrait=true&size=A4&gridlines=false&fitw=true"; 11 12 var pdf = UrlFetchApp.fetch(url, {headers: {'Authorization': 'Bearer ' + token}}).getBlob().setName("【依頼票】"+".pdf"); 13 14 var to = "eeeeeeeeeeeee@yy.jp"; 15 var subject = "【依頼票】"; 16 var body = "依頼票にて新規依頼を受け付けました。\n" 17 + "\n" 18 + "詳細は添付PDFをご確認ください。\n" 19 + "\n" 20 + "以上、よろしくお願いいたします。" 21 + "\n\n" 22 + "-----------------------------------\n" 23 + "指定の宛先\n" 24 + "abc@yy.jp\n" 25 26 GmailApp.sendEmail(to, 27 subject, 28 body, 29 {attachments: pdf}) 30}
試したこと
参考にしたサイトに書かれていたコードそのままを、おなじ手順でスプレッドシートやフォームを同じものを作成し実行してみましたが動きませんでした。
PDFを選択して添付し、指定の宛先へ送るだけの動作であれば上記【ためしたこと】コードで思い通りのメールが送れたのですが、
フォーム送信のたびに新たな内容でPDFを作成したいという部分の解決法が分かりません。
用意したスプレッドシートフォーマットを、フォーム送信されるたびに塗り替えてPDF化する方法が知りたいです。
上記に書かれたとおりでなくてもかまいませんので、なにか代替案がありましたら教えていただきたいです。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
実行ログを確認したところ、下記のエラーが出ておりました。
コメントにて、問題なく実行できたと伺いましたので、再度試してみたところ、エラーは出ませんでしたがメールは届いておらず、
指定したフォルダにPDFもできていない状況です。


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