Google Apps脚本 - 电子邮件库存通知()

大道之行,天下为公。这篇文章主要讲述Google Apps脚本 - 电子邮件库存通知?相关的知识,希望能为你提供帮助。
嗨,您好!
我是javascript和Google表格的初学者,但我试图找到一种方法让Google Apps脚本基本上扫描我从瑞典在线银行带来的数据,在那里他们有一些关于股票如何上涨的信息和下来。
此外,我希望通过电子邮件通知我列表中的其中一个在一天内降低5%。

我试过这样的事情:

let arrayRow = ["+" + 5.91 + "%", "+" + 5.22 + "%", "-" + 5.5 + "%"]; console.log(arrayRow); function stockPricePlus() { if (arrayRow > = "+" + 5 + "%") { console.log("Yay! One of your stocks are going up by 5 % or more!"); } } function stockPriceMinus() { if (arrayRow < = "-" + 5 + "%") { console.log("Oh noes! One of your stocks are going down by 5 % or more!"); } }stockPricePlus(); stockPriceMinus();

这可以在我的javaScript文件中使用,但是我不太确定如何使它从Google表格中连续提取数据并像循环一样运行它们?

我在互联网上发现了一些似乎有点工作的东西,但我也发现代码中有一些缺失的部分。
function sendEmails () { var sheet = SpreadsheetApp.getActiveSheet(); var Price = sheet.getRange("B34:B").getValues(); var data = https://www.songbingjia.com/android/Price.getValues(); var results = []; for (var i = 0; i < data.length; ++i) { var row = data[i]; Logger.log(Price); if (Price > ="+" + 5 + "%") { MailApp.sendEmail("johnsmith@gmail.com", "Stock Price Alert from Stock Price Google Script", "One of your stocks are going up by 5 % or more!"); }if (Price < = "-" + 5 + "%") { MailApp.sendEmail("johnsmith@gmail.com", "Stock Price Alert from Stock Price Google Script", "One of your stocks are going down by 5 % or more!"); }

答案 A ClientSide Timer for Collecting Periodic Stock Prices using GoogleFinance cell formulas这段代码是我用来检查股票的代码的一部分。它有一个计时器功能,可以在浏览器上运行客户端,您可以根据需要调整采样率。我建议每5分钟一次。这样可以很长时间地完成所有工作。我还添加了一个checkStats函数,该函数使用公式(max-min / max)* 100计算百分比变化,并将此值与您可以为StockPrices页面上的每个股票设置的值进行比较。它还设置为在百分比变化大于阈值时发送电子邮件,您可以进行设置。您可以拥有任意数量的股票,但如果您尝试获得太多股票,则可能需要调整采样率。您必须添加电子邮件收件人地址。
我有几个其他功能,以不同的方式绘制各种股票,我没有包括在内。我试着保持这个简单,所以如果我不顾一切地留下一些东西,我不会感到惊讶。请注意,此脚本不会每天自动启动。事实上我几乎没有使用它,但我认为这将是一件有趣的事情,从那以后我发现计时器部分非常方便。
根据我的经验,GoogleFinance标签不会在一天中定期刷新。我看到他们在长达12分钟的时间内没有改变,同时在个人计算机上运行的另一个更精细的系统上观察股价的变化。
datatimer.html:
< !DOCTYPE html> < html> < head> < base target="_top"> < link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css"> < meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/> < script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"> < /script> < link rel="stylesheet" href="https://www.songbingjia.com//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> < script src="http://img.readke.com/220523/03420TL2-1.jpg"> < /script> < script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"> < /script> < style> #my_block{border:2px solid black; background-color:rgba(0,150,255,0.2); padding:10px 10px 10px 10px; } #conv_block{border: 1px solid black; padding:10px 10px 10px 10px; } .bttn_block{padding:5px 5px 0px 0px; } .sndr_block {border:1px solid rgba(0,150,0,0.5); background-color:rgba(150,150,0,0.2); margin-bottom:2px; } < /style> < /head> < body> < form> < div id="my_block" class="block form-group"> < div class="sndr_block"> < div id="myClock" style="font-size:20px; font-weight:bold; "> < /div> < br /> Timer Duration(minutes): < br /> < input id="txt1" type="text" size="4" class="action"/> < select id="sel1" onChange="loadTxt('sel1','txt1'); "> < /select> < div id="cntdiv"> < /div> < br /> < strong> Timer Controls< /strong> < div class="bttn_block"> < input type="button" value="https://www.songbingjia.com/android/Start" name="startShow" id="startShow" onClick="startmytimer(); changeData(); " class="red" /> < /div> < div class="bttn_block"> < input type="button" value="https://www.songbingjia.com/android/Stop" name="stopTimer" id="stopTimer" class="red" /> < /div> < div class="bttn_block"> < input type="button" value="https://www.songbingjia.com/android/Single Ping" name="changedata" id="chgData" class="red" onClick="changeData(); " /> < /div> < /div> < div id="btn-bar"> < br /> < input type="button" value="https://www.songbingjia.com/android/Exit" onClick="google.script.host.close(); " class="green" /> < /div> < /div> < /form> < script> var idx=1; var myInterval=''; var cnt=0; $(function() { var select = document.getElementById('sel1'); select.options.length = 0; for(var i=1; i< 61; i++) { select.options[i-1] = new Option(i,i * 60000); } select.selectedIndex=4; $('#startTimer').click(startmytimer); $('#stopTimer').click(stopTimer); $('#txt1').val(String(select.options[select.selectedIndex].value)); startTime(); }); function startTime(){ var today = new Date(); var h = today.getHours(); var m = today.getMinutes(); var s = today.getSeconds(); m = checkTime(m); s = checkTime(s); document.getElementById('myClock').innerHTML = h + ":" + m + ":" + s; var t = setTimeout(startTime, 500); }function checkTime(i){ if (i < 10) {i = "0" + i}; // add zero in front of numbers < 10 return i; }function startmytimer(){ document.getElementById('cntdiv').innerHTML='< strong> Timer Started:< /strong> ' + document.getElementById('myClock').innerHTML; myInterval=setInterval(changeData, Number($('#txt1').val())); }function stopTimer(){ document.getElementById('cntdiv').innerHTML='Timer Stopped'; clearInterval(myInterval); }function loadTxt(from,to){ document.getElementById(to).value = https://www.songbingjia.com/android/document.getElementById(from).value; }function changeData(){ $('#txt1').css('background','#ffffcc'); google.script.run .withSuccessHandler(updateDisplay) .changeData(); }function updateDisplay(t){ $('#txt1').css('background','#ffffff'); document.getElementById('cntdiv').innerHTML='< strong> Timer Running:< /strong> Count= ' + ++cnt + ' < strong> Time:< /strong> ' + t; }console.log('My Code'); < /script> < /body> < /html>

【Google Apps脚本 - 电子邮件库存通知()】code.公司:
function onOpen(){ SpreadsheetApp.getUi().createMenu('MyTools') .addItem('Show Timer SideBar', 'showTimerSideBar') .addToUi(); }//This is the function driven by the clientside timer trigger It also creates new data sheets for each day. function changeData(){ var ss=SpreadsheetApp.getActive(); var sh=ss.getSheetByName('StockPrices'); var rg=sh.getRange(3,1,1,sh.getLastColumn()); var vA=rg.getValues(); var n=new Date(); var tmr=Utilities.formatDate(n, Session.getScriptTimeZone(), "HH:mm:ss"); var ts=Utilities.formatDate(n, Session.getScriptTimeZone(), "E-MMddyy-HHmmss"); var sheetTitle=Utilities.formatDate(n, Session.getScriptTimeZone(), "E-MMddyy"); vA[0][0]=ts; if(isSheet(sheetTitle)){ ss.getSheetByName(sheetTitle).appendRow(vA[0]); }else{ var sht=ss.insertSheet(sheetTitle); var hA=sh.getRange(1,1,1,sh.getLastColumn()).getValues(); hA[0][0]="TimeStamp"; sht.appendRow(hA[0]); sht.appendRow(vA[0]); } checkStats(sheetTitle); return tmr; }function showTimerSideBar() { var ss=SpreadsheetApp.getActive(); var sh=ss.getSheetByName('StockPrices'); sh.getRange(5,2,1,sh.getLastColumn()-1).clearContent(); //clears the sent row var ui=HtmlService.createHtmlOutputFromFile('datatimer').setTitle('Javascript Trigger Generator'); SpreadsheetApp.getUi().showSidebar(ui); }function isSheet(sheetname){ var r=false; var ss=SpreadsheetApp.getActive(); var allSheets=ss.getSheets(); for(var i=0; i< allSheets.length; i++){ if(allSheets[i].getName()==sheetname){ r=true; break; } } return r; }//This function checks stats and compares them to limits to determine if warning email messages should be sent function checkStats(page) { var ss=SpreadsheetApp.getActive(); var sh=ss.getSheetByName(page); var rg=sh.getRange(1,2,sh.getLastRow(),sh.getLastColumn()-1); var vA=rg.getValues(); var minA=vA[1].slice(0); var maxA=vA[1].slice(0); var pchA=[]; for(var i=2; i< vA.length; i++) { for(var j=0; j< vA[i].length; j++) { if(vA[i][j]> maxA[j]) { maxA[j]=vA[i][j]; } if(vA[i][j]< minA[j]) { minA[j]=vA[i][j]; } } } for(var i=0; i< minA.length; i++) { pchA.push(Number(((maxA[i]-minA[i])/maxA[i]) * 100).toFixed(2)); } var spsh=ss.getSheetByName('StockPrices'); var limitA=spsh.getRange(4,2,1,spsh.getLastColumn()-1).getValues(); var nameA=spsh.getRange(1,2,1,spsh.getLastColumn()-1).getValues(); var sentA=spsh.getRange(5,2,1,spsh.getLastColumn()-1).getValues(); var msgA=[]; for(var i=0; i< pchA.length; i++) { if(pchA[i]> limitA[i] & & sentA[i]!="SENT") { msgA.push({name:nameA[i],change:pchA[i],limit:limitA[i],index:i}); } } if(msgA.length> 0){ var html="< h1> Stocks Exceeding Change Limit< /h1> "; var text='Stocks Exceeding Change Limit '; for(var i=0; i< msgA.length; i++) { html+=Utilities.formatString('< br /> Stock Name: < str

    推荐阅读