###【前提・実現したいこと】
googleフォームに検索条件を入力し送信を行うと、
その検索条件に従ってカレンダーなどの情報を取得し、
マイドライブ上のスプレッドシートに取得した情報を保存する。
その後、スプレッドシートをExcel形式に変換し、
そのExcelをメールに添付する形でメール送信する。
###発生している問題
上記を実現するために、下記のような実装にしていますが、
スプレッドシートの変更前の情報で、メール送信されてしまいます。
各々の機能の1つ1つは問題なく動作しているのですが
最新のスプレッドシートの情報で、メールが送れない状況です。
・googleフォーム
スクリプト(ここですべて制御している)
・スプレッドシート
スクリプトなし
###スクリプト上の機能
1.フォームから検索条件を取得
2.検索条件に従ってカレンダーなどから情報を取得
3.取得した情報をスプレッドシート上に保存
4.更新したスプレッドシートをExcel形式に変換し、メール送信
###試したこと
GASが終了しないと、スプレッドシートへの更新が完了しないのではないかと考え、
スクリプトからスクリプトを呼ぶ方法を模索し
数秒後に起動するトリガーを設置することを考えましたが
googleフォームのスクリプトでは時間指定のトリガーを設置できないことがわかり、
いきずまってしまいました。
###質問
どのような全体設計をすれば実現したいことが可能になりますでしょうか?
また、即時スプレッドシートへの反映の仕方などありませんでしょうか?
###ソース
function submitForm(e){ //ここでフォームの検索条件を取得するが割愛する loadEvent(); sendMail_Excel(); } function loadEvent() { sheetcreate(); var cal = CalendarApp.getCalendarById("カレンダーID"); var events = cal.getEvents(new Date(2017, 7, 1), new Date(2017, 7, 31)); var arr = []; for(var i=0; i < events.length; i++){ var e = []; var event = events[i]; e.push(event.getStartTime()); e.push(event.getEndTime()); e.push(event.getTitle()); arr.push(e); } paste(arr); } function sheetcreate(){ var mspid = "スプレッドシートのID"; var ash = SpreadsheetApp.openById(mspid); var sheet = ash.getSheetByName("test1"); if(sheet==null){ sheet = ash.insertSheet("test1"); }else{ sheet.clear(); } } function paste(array){ var mspid = "スプレッドシートのID"; var ash = SpreadsheetApp.openById(mspid); var sheet = ash.getSheetByName("test1"); var lastColumn = array[0].length; var lastRow = array.length; sheet.getRange(2,1,lastRow,lastColumn).setValues(array); } function sendMail_Excel() { var targetFileId = "スプレッドシートのID"; var objFile; var fileName; var mailto = "メール送信先"; var subject = "スプレッドシート添付テスト"; var body = ""; var fetchUrl; var fetchOpt = { "headers" : { Authorization: "Bearer " + ScriptApp.getOAuthToken() }, "muteHttpExceptions" : true }; var xlsxName; var attachmentFiles = new Array(); try { objFile = DriveApp.getFileById(targetFileId); fileName = objFile.getName(); xlsxName = fileName + ".xlsx"; body = xlsxName + "を添付します"; fetchUrl = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + targetFileId + "&exportFormat=xlsx"; attachmentFiles.push(UrlFetchApp.fetch(fetchUrl, fetchOpt).getBlob().setName(xlsxName)); } catch(e){ subject = "ERROR:" + subject; body = "エラー : " + e.message; } // メール送信 GmailApp.sendEmail(mailto, subject, body, {attachments:attachmentFiles}); }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/09 10:28