簡體   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