GAS フォーム送信時に規定のフォーマット(スプレッドシート)にデータを抽出→そのスプレッドシートをPDF化して添付したメールを指定の宛先へ通知したい

前提

Googleフォームを依頼フォームとして利用することになりました。
依頼を受けた者が、作業時にフォームの内容を確認しながら作業するため、1行で吐き出されたスプレッドシートではなく、
A4用紙1枚に見やすく配置されたフォーマットにフォームの回答を抽出してPDF化し、
そのPDFを添付した通知メールを指定のメールアドレス宛に送りたいです。

・フォーム入力と同時に入力者とCCに自動通知
・PDFを添付したメールを指定メールアドレスへ送付
というのは実現できたのですが、フォームと連携したスプレッドシート(データ蓄積用)とは別に、フォーム送信時に新規依頼内容を
規定のフォーマットに項目ごとにセルを指定して反映させ、その反映済みスプレッドシートをPDF化して指定の宛先へメールしたいのですが、
どうしても方法が見つかりません。
GASは初心者ですので、なるべく初心者でも分かるようにご教授いただけると幸いです。

実現したいこと

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

入力者への自動通知メールはフォームのエディタにスクリプトを書いて問題なく実装済みです。
指定の宛先に送りたいメールについて、どこに(フォーム?スプレッドシート?)どのようにコードを書けばよいのか(入力者への自動通知メールとおなじスクリプト内に書けるのか?新たにスクリプトを作成するべきか?その場合のトリガーはスクリプトごとに必要なのか?)わからない状況です。
下記アドレスのコードを参考におなじようにフォームのエディタに書いてみましたが動作しません。
■GoogleフォームからPDF作成しメール送信
https://imabari.hateblo.jp/entry/2018/10/25/225825

エラーメッセージ

該当のソースコード

GAS

// 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;  //項目は全部で67項目あります 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;    //項目は全部で67項目あります } } // スプレッドシートURLから抽出したIDを入力 var ssid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; var ss = SpreadsheetApp.openById(ssid); var pdfss = ss.getSheetByName("依頼票PDF"); 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("J5").setValue(resuest_timing); //依頼タイミング  //項目は全部で67項目あります 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 } }); // ファイル名を作成「依頼票_番号.pdf」 var fileName = proposal_num + "_" + project_title + "(" + resuest_timing + ")" + request_date; // Googleドライブ上のPDF格納先フォルダからIDを入力 var folder = DriveApp.getFolderById("yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"); var fileBlob = response.getBlob().setName(fileName); folder.createFile(fileBlob); // メールアドレス MailApp.sendEmail("eeeeeeeeeeeeee@yy.jp", "【新規依頼受付】", "新規依頼を受付ました。詳細は添付のPDFをご確認ください。", { attachments : [fileBlob] }); } catch (e) { Logger.log("ファイル生成に失敗しました" + e) } }

GAS

//【試したこと】ドライブのPDF用フォルダに置いてあるPDFを添付してメールを送るコード function sendMail(){ var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var key = spreadsheet.getId(); var sheetName = spreadsheet.getSheetByName("【依頼票】"); var gid = sheetName.getSheetId(); var token = ScriptApp.getOAuthToken(); var url = "https://docs.google.com/spreadsheets/d/" + key + "/export?gid=" + gid + "&format=pdf&portrait=true&size=A4&gridlines=false&fitw=true"; var pdf = UrlFetchApp.fetch(url, {headers: {'Authorization': 'Bearer ' + token}}).getBlob().setName("【依頼票】"+".pdf"); var to = "eeeeeeeeeeeee@yy.jp"; var subject = "【依頼票】"; var body = "依頼票にて新規依頼を受け付けました。\n" + "\n" + "詳細は添付PDFをご確認ください。\n" + "\n" + "以上、よろしくお願いいたします。" + "\n\n" + "-----------------------------------\n" + "指定の宛先\n" + "abc@yy.jp\n" GmailApp.sendEmail(to, subject, body, {attachments: pdf}) }

試したこと

参考にしたサイトに書かれていたコードそのままを、おなじ手順でスプレッドシートやフォームを同じものを作成し実行してみましたが動きませんでした。
PDFを選択して添付し、指定の宛先へ送るだけの動作であれば上記【ためしたこと】コードで思い通りのメールが送れたのですが、
フォーム送信のたびに新たな内容でPDFを作成したいという部分の解決法が分かりません。
用意したスプレッドシートフォーマットを、フォーム送信されるたびに塗り替えてPDF化する方法が知りたいです。
上記に書かれたとおりでなくてもかまいませんので、なにか代替案がありましたら教えていただきたいです。

よろしくお願いいたします。

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

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

コメントを投稿

0 コメント