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

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

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

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

Google フォーム

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

Google ドライブ

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

Gmail

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

Google Apps Script

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

解決済

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

e-y
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のクラウドのスクリプト言語です。

1回答

0リアクション

0クリップ

436閲覧

投稿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

// 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/ツールのバージョンなど)

実行ログを確認したところ、下記のエラーが出ておりました。
イメージ説明
コメントにて、問題なく実行できたと伺いましたので、再度試してみたところ、エラーは出ませんでしたがメールは届いておらず、
指定したフォルダにPDFもできていない状況です。

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

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

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

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

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

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

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

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

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

qnoir

2022/08/31 13:03 編集

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

2022/09/01 01:03

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

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Google スプレッドシート

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

Google フォーム

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

Google ドライブ

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

Gmail

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

Google Apps Script

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