繁体   English   中英

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

[英]Google Apps Script - Email stock notification?

嗨,您好!

我是JavaScript和Google表格的初学者,但我正在尝试寻找一种方法让Google Apps Script基本上扫描我从瑞典在线银行带入那里的数据,他们在那里可以获得有关股票上涨情况的一些信息和向下。

此外,当列表中的某项一天下降例如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 = 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!");
    }

使用GoogleFinance单元格公式收集定期股票价格的ClientSide计时器

该代码是我用来检查股票的代码的一部分。 它具有计时器功能,可在浏览器的客户端运行,您可以根据需要调整采样率。 我建议每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="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></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="Start" name="startShow" id="startShow" onClick="startmytimer();changeData();" class="red" /></div>
        <div class="bttn_block"><input type="button" value="Stop" name="stopTimer" id="stopTimer" class="red" /></div>
        <div class="bttn_block"><input type="button" value="Single Ping" name="changedata" id="chgData" class="red" onClick="changeData();" /></div>
      </div>
      <div id="btn-bar">
        <br /><input type="button" value="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 = 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>

Code.gs:

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\n';
    for(var i=0;i<msgA.length;i++) {
      html+=Utilities.formatString('<br />Stock Name: <strong>%s</strong><br />Limit: <strong>%s</strong><br />Change: <strong>%s</strong><hr width="100%"/><br />', msgA[i].name,msgA[i].limit,msgA[i].change);
      text+=Utilities.formatString('\nStock Name: %s\nLimit: %s\nChange: %s\n\n', msgA[i].name,msgA[i].limit,msgA[i].change);
      sentA[msgA[i].index]="SENT";
    }
    //GmailApp.sendEmail(recipient, 'Stocks Exceeding Change Limit', text, {htmlBody:html})
    spsh.getRange(5,2,1,spsh.getLastColumn()-1).setValues(sentA);
  }
}

这是“股票价格”页面的外观:

在此处输入图片说明

每日数据页面如下所示:

在此处输入图片说明

这就是计时器侧边栏的样子:

datatimer.html侧栏

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM