大道之行,天下为公。这篇文章主要讲述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
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 来自GmailApp附件的DriveApp createFile无法正常工作
- 从服务器响应(请求)返回HTML,好的还是不好的做法()
- 你需要了解的有关条件html注释的所有信息
- 在Twitter或Faceboook上共享链接时选择了错误的图像-解决方案
- 如何使用Google Chrome和SnappySnippet扩展名从DOM元素中检索HTML和CSS源代码
- 你可能不知道的Github键盘快捷键
- 如何在Windows中使用Xampp安装和设置PrestaShop
- 如何使用Javascript,html5和getUserMedia访问网络摄像头
- 如何使用php从javascript保存base64图像