google formを利用して休日出勤届を会社へ自動で送信されるようにしたいです。
フォームの回答はスプレッドシートに自動的に集計されています。
集計された一覧は残したまま、最新の回答のみを別シートに(提出用書式にあわせて)記入→メール送信、という流れを自動でできるようにしたいのです。
伝わり難い文章となって大変申し訳ありません。
編集してみましたが如何でしょうか…。
右も左もわからぬ新参者で大変恐縮です。
ご存知の方入らっしゃいましたらご教授いただければ助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/01 02:42
2018/10/01 03:06
2018/10/01 08:44

回答1件
0
ベストアンサー
何となく書いてみました。
「※」があるところを適切に設定してください。
最低でも「※」の1,5,6,7,8がご利用の環境にあわせて設定されていないと正常に動きません。
下記のコードをフォームの集計がされるシートを開いて、「ツール」→「スクリプトエディタ」を開いて貼り付けをします。
また、そのスクリプトエディタの画面で「編集」→「現在のプロジェクトのトリガー」にて、「実行」=「sender」「イベント」=「スプレッドシートから、フォーム送信時」として登録する必要があります。
上記が適切に設定されていれば、動作することを当方では検証済みです。
javascript
1function sender() { 2 const dat = createRequiredBlob(); 3 const blob = dat[0]; 4 const param = dat[1]; 5 const applicant = param["B2"]; // "B2"のところを※8で申請者の右に指定したセル番地にかえてください ※9 6 const to = ""; // あてさきに設定するアドレス(webmaseter@example.com) ※1 7 MailApp.sendEmail({ 8 to: to, 9 name: applicant, //fromの名前がかわるはず。 10 subject: "申請 (申請者:"+applicant +")", // 件名 ※2 11 body: "添付ファイルをご確認ください", // 本文 ※3 12 attachments: [blob.setName("休暇申請("+applicant+").pdf")] // ファイル名の変更可 ※4 13 }); 14} 15function createRequiredBlob() { 16 const id = ""; // form回答が来るスプレッドシートのid ※5 17 const template = ""; // 書式のテンプレとして利用するシートの名前 ※6 18 const answers = "フォームの回答"; // form回答が入るシートの名前 ※7 19 20 // 添付ファイル準備 21 const spreadSheet = SpreadsheetApp.openById(id); 22 const temporary = Utilities.getUuid(); 23 const ansSheet = spreadSheet.getSheetByName(answers); 24 const tempSheetName = copySheet(spreadSheet, template, temporary); 25 const param = buildFillinParam(getLastData(ansSheet)); 26 fillIn(spreadSheet, tempSheetName, param); 27 SpreadsheetApp.flush(); 28 const tempSheet = spreadSheet.getSheetByName(tempSheetName); 29 const blob = fetchBlob(spreadSheet.getId(), tempSheet.getSheetId()); 30 spreadSheet.deleteSheet(tempSheet); 31 return [blob,param]; 32} 33 34function getLastData(spreadSheet) { 35 const full = spreadSheet.getDataRange().getDisplayValues(); 36 const last = full[full.length - 1]; 37 const header = full[0]; 38 return header.reduce(function(previousValue, currentValue, index, array) { 39 previousValue[currentValue] = last[index]; 40 return previousValue; 41 },{}); 42} 43 44function buildFillinParam(formData) { 45 const map = {申請者:"B2", 区分:"B3", 開始日:"B4", 終了日:"B5", 就業時間:"B6", 業務内容:"B7", 備考:"B8", }; // 書式のテンプレを確認しつつ、書き込みたいセル番地を適宜に変更 ※8 46 const param = {}; 47 Object.keys(map).forEach(function(element, index, array) { 48 param[map[element]] = formData[element]; 49 }); 50 return param; 51} 52 53function copySheet(spreadSheet, srcName, dstName) { 54 const srcSheet = spreadSheet.getSheetByName(srcName); 55 const copied = srcSheet.copyTo(spreadSheet); 56 copied.setName(dstName); 57 return copied.getSheetName(); 58} 59 60function fillIn(spreadSheet, sheetName, dat) { 61 const sheet = spreadSheet.getSheetByName(sheetName) 62 Object.keys(dat).forEach(function(element, index, array) { 63 sheet.getRange(element).setValue(dat[element]); 64 }); 65} 66 67// https://www.virment.com/create-pdf-google-apps-script/ より改変 68function fetchBlob(ssid, sheetid) { 69 const url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid); 70 71 const opts = { 72 exportFormat: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx 73 format: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx 74 size: "A4", // 用紙サイズの指定 legal / letter / A4 75 portrait: "true", // true → 縦向き、false → 横向き 76 fitw: "true", // 幅を用紙に合わせるか 77 sheetnames: "false", // シート名をPDF上部に表示するか 78 printtitle: "false", // スプレッドシート名をPDF上部に表示するか 79 pagenumbers: "false", // ページ番号の有無 80 gridlines: "false", // グリッドラインの表示有無 81 fzr: "false", // 固定行の表示有無 82 gid: sheetid // シートIDを指定 sheetidは引数で取得 83 }; 84 85 const url_ext = []; 86 87 for( optName in opts ){ 88 url_ext.push( optName + "=" + opts[optName] ); 89 } 90 91 const options = url_ext.join("&"); 92 93 const token = ScriptApp.getOAuthToken(); 94 95 const response = UrlFetchApp.fetch(url + options, { 96 headers: { 97 'Authorization': 'Bearer ' + token 98 } 99 }); 100 return response.getBlob(); 101} 102 103 104// テスタ 105function getLastData_test() { 106 const spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 107 const answers = "フォームの回答"; 108 const sheet = spreadSheet.getSheetByName(answers); 109 Logger.log(getLastData(spreadSheet)); 110} 111function buildFillinParam_test() { 112 const spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 113 const answers = "フォームの回答"; 114 const sheet = spreadSheet.getSheetByName(answers); 115 Logger.log(buildFillinParam(getLastData(sheet))); 116} 117function copySheet_test() { 118 const spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 119 const tmp = Utilities.getUuid(); 120 const sheetName = "template"; 121 Logger.log(copySheet(spreadSheet, sheetName, tmp)); 122} 123function fillIn_test1() { 124 const spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 125 const sheetName = "template"; 126 const dat = {B2 : "b2", B3 : "b3", B4 : "b4", B5 : "b5", B6 : "b6", B7 : "b7", }; 127 fillIn(spreadSheet, sheetName, dat); 128} 129function fillIn_test2() { 130 const spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 131 const sheetName = "template"; 132 fillIn(spreadSheet, sheetName, buildFillinParam(getLastData(spreadSheet))); 133}
こちらのミスでなければサポートはいたしません。
投稿2018/10/01 08:38
編集2018/10/04 00:07総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。