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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

Q&A

解決済

1回答

1536閲覧

【GAS】スプレッドシートの更新内容がメール送信できない

kikukiku

総合スコア514

Google Apps Script

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

0グッド

4クリップ

投稿2017/08/08 00:40

編集2017/08/09 10:21

###【前提・実現したいこと】
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 + "&amp;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}); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

kikukiku さんのコードを一部簡略化して試したところ、同じ現象が発生しました。
そこで、setValue() のあとに getValue() を挟んでみたら解決しました。
原因が分かっていないため kikukiku さんの環境でも解決するかは分かりませんが、良かったら試してみてください。
あと、コードはコードとして表示されるようにしてくれると助かります。
(コード部分を範囲指定して「</>」アイコンをクリック)

function submitForm(e){ var ss = SpreadsheetApp.openById("スプレッドシートのID"); // kikukiku さんの loadEvent() を簡略化 var sheet = ss.getSheetByName("シート1"); sheet.getRange("A1").setValue(new Date()); // setValue() したあとで getValue() してみると最新状態で添付されるようになった // ここをコメントアウトすると古い状態で添付される Logger.log(sheet.getRange("A1").getValue()); sendMail_Excel(); // kikukiku さんのコードと同じため省略 }

投稿2017/08/09 09:17

rokuni

総合スコア174

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

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

kikukiku

2017/08/09 10:28

素晴らしい。ご指摘頂いた方法で解決しました。 思いもしない解決方法で、自力では絶対に解決できなかったと思います。 本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問