前提・実現したいこと
※初心者です。初めに書いていなくてすみません。
GASとVueで、メール受信時に内容をスプレッドシートに転記し、
さらに転記したメールの内容をWebブラウザにアラートかプッシュ通知で表示するプログラムを
作成しようとしています。
※追記
taretailやいろんなサイトでメール、スプレッドシートの動かし方を知って、それをコピペ、編集したものになります。
エラーが起きると特定のエラーメールを受信するようにしているため、(別の機器)
それに合わせてメールの内容をスプレッドシート経由でHTMLブラウザに表示するようにしたいと思い作成を始めました。
メール内容をコピペしてシート2のA1に転載し、A1のデータをmaildataと共通させることでアラートとして出したいと考えています。
(アラートとして追記が一番やりやすそうだったのでそうしました)
メールをfunction:mainのトリガーを毎分起動して確認し、1分以内のエラーメールをシート2のA1に転載しています。(ここまでは大丈夫)
ついでにmaildataというグローバル関数に入れ込むことで、HTMLから参照できるかと思いましたがうまくいっていないです。
(A1への転載はうまくいっていますが、maildataがHTMLに送られていない?)
※追記終了
発生している問題・エラーメッセージ
Vueのwatch関数でmaildataに格納したメールデータを監視し、変化があった場合に表記させたいのですが、
maildataという変数を読み込めておらず、機能していないように思います。
(document.writeでmaildataでは表示されない?)
maildataを関数として使えるようにしたいのですが、宣言や定義そのものが足りない、間違っているのでしょうか。
どうしてもわからないため、教えていただけると助かります。
該当のソースコード
※appscript.json
json
1 2{ 3 "timeZone": "Asia/Tokyo", 4 "dependencies": { 5 "enabledAdvancedServices": [ 6 { 7 "userSymbol": "Gmail", 8 "version": "v1", 9 "serviceId": "gmail" 10 }, 11 { 12 "userSymbol": "Drive", 13 "version": "v2", 14 "serviceId": "drive" 15 } 16 ] 17 }, 18 "webapp": { 19 "executeAs": "USER_DEPLOYING", 20 "access": "MYSELF" 21 }, 22 "oauthScopes": [ 23 "https://www.googleapis.com/auth/spreadsheets.currentonly", 24 "https://www.googleapis.com/auth/spreadsheets", 25 "https://www.googleapis.com/auth/script.external_request", 26 "https://www.googleapis.com/auth/gmail.readonly", 27 "https://www.googleapis.com/auth/gmail.modify", 28 "https://mail.google.com/" 29 ], 30 "exceptionLogging": "STACKDRIVER", 31 "runtimeVersion": "V8" 32} 33
gs
1 2function doGet(e){ 3 var html = HtmlService.createTemplateFromFile("index").evaluate(); 4 var content = html.getContent(); 5 return HtmlService.createTemplate(content).evaluate(); 6 } 7 8function getData(ssId,sheetName) { 9 // スプレッドシートの取得 10 var ss = SpreadsheetApp.openById(ssId); 11 // データの取得 12 var values = ss.getSheetByName(sheetName).getDataRange().getValues(); 13 return values; 14} 15 16function fetchContactMail() { 17 //取得間隔 18 var now_time= Math.floor(new Date().getTime() / 1000) ;//現在時刻を変換 19 var time_term = now_time - (60 + 3); //63秒にして取得できない事態がないように 20 21 //検索条件指定 22 var strTerms = '(subject:{' + error + '} is:unread after:'+ time_term + ')'; 23 24 //取得 25 var myThreads = GmailApp.search(strTerms); 26 var myMsgs = GmailApp.getMessagesForThreads(myThreads); 27 var valMsgs = []; 28 for(var i = 0; i < myMsgs.length;i++){ 29 valMsgs[i] = " " + myMsgs[i].slice(-1)[0].getDate().getMonth() + "/"+ myMsgs[i].slice(-1)[0].getDate().getDate() 30 + " " + myMsgs[i].slice(-1)[0].getDate().getHours() + ":" + myMsgs[i].slice(-1)[0].getDate().getMinutes() 31 + "\n[from]" + myMsgs[i].slice(-1)[0].getFrom() 32 + "\n" + myMsgs[i].slice(-1)[0].getSubject() 33 valMsgs[i] = valMsgs[i] + "\n\n[Message]\n"+ myMsgs[i].slice(-1)[0].getPlainBody(); 34 35 } 36 return valMsgs; 37 } 38 39 function main() { 40var sheet = SpreadsheetApp.openById("スプレッドシートID").getSheetByName("シート2"); 41var t=HtmlService.createTemplateFromFile("index");//上で検索したメールをシート2に転載し、共通変数maildataに入れ込む。この処理が間違っている気がします 42 new_Me = fetchContactMail() 43 if(new_Me.length > 0){ 44 for(var i = new_Me.length-1; i >= 0; i--){ 45 sheet.getRange("A1").setValue(new_Me[i]); 46 t.new_Me[i] = maildata; 47 48 } 49 } 50} 51 52function include(filename) { 53 return HtmlService.createTemplateFromFile(filename).evaluate().getContent(); 54} 55 56//追加 57var sheet = SpreadsheetApp.openById("1HPx6SzFB8hdd37bwCianXOC5L2Yya2Xu4CmBQzlRAWY").getSheetByName("シート2"); 58var errormail = sheet.getRange("A1").getValue(); 59function newmail(){ 60 return SpreadsheetApp.openById("シートID").getSheetByName("シート2").getRange("A1").getValue(); 61} 62
html
1//変更後 2<!DOCTYPE html> 3<html> 4 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 5 <head> 6 <base target="_top"> 7 8 <!-- vue.js --> 9<meta charset="UTF-8"> 10 11 <?!= include('js'); ?> 12 13 </head> 14 <body> 15 16<div id= "app" > 17 <p>{{ message }}</p> 18 </div> 19<?!= include('css'); ?> 20 21 22</body> 23</html>
html
1//変更前 2<!DOCTYPE html> 3<html> 4 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 5 <head> 6 <base target="_top"> 7 8 <!-- vue.js --> 9<meta charset="UTF-8"> 10 </head> 11 <body> 12 13 <?!= include('js'); ?> 14 15<script> 16 17 window.hex = () => { 18 document.alert("検知しています") 19 } 20 21</script> 22 23</body> 24</html>
js
1 2<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 3 4<script> 5google.script.run.withSuccessHandler(vuetest).newmail(); 6 7function vuetest(message){ 8 new Vue({ 9 el: "#app", 10 data:{ 11 message : message 12 }, 13 watch:{ 14 message:function(){ 15alert(message) 16 }, 17 } 18}); 19} 20</script>
//消去 <script> var vm = new Vue({ el: "#vm", data: { message: maildata }, watch:{ message:{ window.hex() document.alert("変更を検知しました") } } }) </script>
試したこと
追加・変更部分で、messageをメールの中身に変更はできました。ただ、メールに対応してシート2A1が変化しても、Webアプリでは何も変化しません。
メッセージという変数参照では呼び出している中身が変化しても、下の処理は行われないのでしょうか?
補足情報(FW/ツールのバージョンなど)
GASのWebブラウザで編集しています。
回答1件
あなたの回答
tips
プレビュー