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

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

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

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

Google フォーム

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

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Gmail

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

Google Apps Script

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

Q&A

解決済

1回答

749閲覧

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

e-y

総合スコア3

Google スプレッドシート

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

Google フォーム

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

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Gmail

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/08/31 09:05

編集2022/09/01 02:56

前提

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もできていない状況です。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/08/31 13:03 編集

質問文中の「該当のソースコード」が「動作しません」とのことですが、フォーム送信後、実行ログに何かエラーが記録されていないでしょうか? というのは、こちらでは、該当のソースコードのシートIDやドライブID、メールアドレスを実在のものに変えて、トリガーを設定の上手元で実行したところ、うまく動作しています。 仮に質問者さんの方で実行ログにエラーが記録していればそのエラーを省略せずに質問に追記してください。 実行ログの確認方法については https://teratail.com/questions/a8ipwwkhkevj67#reply-klg66jbqzua5k1 の「質問③」の回答を参照してください。
e-y

2022/09/01 01:03

コメントありがとうございます。 実行ログを追記いたしました。なにとぞよろしくお願いいたします。
guest

回答1

0

ベストアンサー

ログ確認および画面の貼り付けありがとうございます。
・まず、画像のログのエラーについてですが、真ん中の列が「エディタ」となっていることから、エディタで実行ボタンをクリックして実行したときにエラーが発生している、ということだと思います。

しかしながら、エディタの「実行」ボタンをクリックしてプログラムを実行したときに画像のエラーが発生するのは、仕様であって不具合ではありません。
なぜならば、仮に正しくトリガーで「フォームからの送信時」にmyFunction関数を実行するように設定されていたとしても、
エディタから直接実行した場合は、関数の event 引数には何も渡されないからです。

(トリガーが「フォームからの送信時」にmyFunction関数を実行するように設定されているという前提で)myFunction関数の event 引数にフォームの送信内容が渡されるのは、フォームの送信時に限ります。

・(トリガーが「フォームからの送信時」にmyFunction関数を実行するように設定されているという前提で)もしフォーム送信時にも何も起こらないならば、下記を見直してください。

  • 送信先に設定しているメールアドレスのあて先が意図している宛先であるか。(送信先に設定しているアドレスと届くはずと思っているアドレスが異なっていないか)
  • メールの受信側でgoogle.comからのメールを拒否設定していたり、迷惑メールフォルダ等に振り分けられていないか。(特に会社のアドレスなどですと、Googleのようなサービスを利用させまいとする会社側の秘密裏の設定で、知らない間に添付ファイル付きのメールだけ届かなくなっているようなことがあります)

投稿2022/09/01 01:50

編集2022/09/01 01:57
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

e-y

2022/09/01 03:14

参考にしたサイトのとおりであれば問題なく実行できるとのことでしたので、再度、参考サイトからコードをコピーしてきて、項目・メールアドレス・メール本文・スプレッドシートID・フォルダID以外のところを触らず作成しなおしてフォーム送信してみたところ、きちんとPDFつきメールが送信されてきました。大変お騒がせしました。 もともとPDFを添付しないバージョンでフォーム入力者用と指定宛先用をひとつのスクリプトで書いたものを先に作っていたため、その一部を流用しようとヘンなところを触ってしまっていたようです。 ほとほと困り果てていたので、丁寧な回答をいただき本当に感謝しております。ありがとうございました!
退会済みユーザー

退会済みユーザー

2022/09/01 03:26 編集

フィードバックありがとうございます。 編集されたエラーメッセージから推測するに、おそらく もともとのコードのうち、質問文では省略されている部分の中にあったと思われる「reason_hurry」という変数を定義し忘れていらっしゃった、または定義していたけれども、使う側で綴りを誤っていらっしゃったのではないかと思います。(あくまでも推測です。間違っていたらすみません)
e-y

2022/09/02 02:48

こちらこそ原因究明にご助力いただきありがとうございます。 解決したので削除したのですが修正後、実行ログを確認すると「ReferenceError: reason_hurry is not defined」となっていたので確認したところ「var reason_hurry;」の文字が薄くグレーになっていました。 項目が多く、スプレッドシート上で「=GOOGLETRANSLATE(A29,"ja","en")」という感じで日本語を英語に翻訳し、わかりにくいものは編集していたのですが、hurryになおすべきところをコード内の一部をdetailのままにしていたのがエラーの原因でした。 「case '理由(詳細)':reason_details = value; break;」「pdfss.getRange("F19").setValue(reason_details); //理由(詳細)」 このような誤記によるエラーは随時確認して解決していたのですが、もともとの動かなかった原因はおそらく別の方がつくったコードを、今回参考したコードに一部抜粋してドッキングしたことが原因のような気がします。 よく分からないままに応用を利かせるのはほどほどにしようと反省いたしました。 この度は迅速にご対応いただき本当に助かりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問