【问题标题】:How to make google spreadsheet refresh itself every 1 minute?如何让谷歌电子表格每 1 分钟刷新一次?
【发布时间】:2014-04-08 06:01:41
【问题描述】:

我的谷歌电子表格正在使用GOOGLEFINANCE('symbol','price) 函数来检索我的投资组合的股票价格。不幸的是,我现在必须手动刷新。如何让电子表格每 1 分钟刷新一次?

感谢您的帮助。

【问题讨论】:

    标签: google-apps-script google-sheets google-finance


    【解决方案1】:

    如果您使用的是新版 Google 表格,这就是您需要做的所有事情,according to the docs

    在您的电子表格中的“文件”>“电子表格设置”中将重新计算设置更改为“每分钟更改一次”。

    这将使整个工作表在服务器端每分钟自行更新,无论您的浏览器中是否有电子表格。

    如果您使用的是旧版 Google 表格,则需要使用此公式添加一个单元格以实现相同的功能:

    =GoogleClock()
    

    编辑以包含新旧 Google 表格并更改为 =GoogleClock()

    【讨论】:

    • @rickcnagy 我不知道这是否仍然有效,因为“每分钟更改一次”设置似乎只更新 NOW()、TODAY()、RAND() 和 RANDBETWEEN() 公式,而不是整个工作表
    • 如何使用now ?只需插入一个单元格=now()?这会更新整个工作表吗?
    【解决方案2】:

    如果您只是在寻找 GOOGLEFINANCE 函数的刷新率,请记住,数据延迟最长可达 20 分钟(根据 Google 财经免责声明)。

    单符号刷新率(使用GoogleClock

    这是刷新操作的修改版本,考虑到数据延迟,以节省非生产性刷新周期。

    =GoogleClock(GOOGLEFINANCE(symbol,"datadelay"))
    

    例如,用:

    • 符号: GOOG
    • 数据延迟: 15(分钟)

    然后

    =GoogleClock(GOOGLEFINANCE("GOOG","datadelay"))
    

    导致基于数据的动态刷新率:

    =GoogleClock(15)
    

    多符号刷新率(使用GoogleClock

    如果您的工作表包含多行符号,您可以为每个符号添加一个 datadelay 列并使用最小值,例如:

    =GoogleClock(MIN(dataDelayValuesNamedRange))
    

    其中dataDelayValuesNamedRange 是包含每个符号的数据延迟值的单元格范围的绝对引用或命名引用(假设这些值不同)。

    没有GoogleClock()

    GoogleClock() 功能于 2014 年被移除,并替换为用于刷新工作表的设置设置。目前,我已确认替换设置仅在从桌面浏览器访问时才可在表格中使用,而不是移动应用程序(我使用的是 Google 的移动表格应用程序,更新于 2016 年 3 月 14 日)。

    (这部分答案基于 Google Docs Help,部分内容来自 Google Docs Help)

    更改“某些”Google 表格功能的更新频率:

    1. 打开一个电子表格。点击文件 > 电子表格设置
    2. 在重新计算部分,从下拉菜单中选择一个设置。
    3. 设置选项有:
      • 更改时
      • 每分钟都在变化
      • 每小时变化一次
    4. 点击保存设置

    注意外部数据函数按以下间隔重新计算:

    • 导入范围:30 分钟
    • ImportHtml、ImportFeed、ImportData、ImportXml:1 小时
    • GoogleFinance:2 分钟

    前面章节中对datadelay 属性的显示和使用的引用以及更有效的工作表编码概念仍然适用。

    从积极的方面来说,无论您是否加载了工作表,Google 服务器都会继续刷新新的刷新选项。这肯定对共享工作表有利;对于 Google Apps 脚本 (GAS) 更是如此,其中 GAS 用于工作流代码或引用的数据用作事件的触发器。

    [*] 到目前为止我的理解(我目前正在测试这个)

    【讨论】:

    • GoogleClock 已于 2014 年弃用。您确定这可行吗?
    • 感谢 Mogsdad,我也发现了这一点。我在原始回复中错过了这一点。
    【解决方案3】:

    GOOGLEFINANCE 可能会延迟 20 分钟,因此每分钟刷新一次并没有真正的帮助。

    您可以使用不同的来源,而不是 GOOGLEFINANCE。我正在使用RealTime stock prices(我尝试了几个,但这是迄今为止最容易实现的。他们有返回 JSON { Name: CurrentPrice }

    的 API

    这是一个可以在 Google 表格中使用的小脚本(工具->脚本编辑器)

    function GetStocksPrice() {      
       var url = 'https://financialmodelingprep.com/api/v3/stock/real-time- 
       price/AVP,BAC,CHK,CY,GE,GPRO,HIMX,IMGN,MFG,NIO,NMR,SSSS,UCTT,UMC,ZNGA';
       var response = UrlFetchApp.fetch(url);
    
       // convert json string to json object
       var jsonSignal = JSON.parse(response);    
    
      // define an array of all the object keys
      var headerRow = Object.keys(jsonSignal);
      // define an array of all the object values
      var values = headerRow.map(function(key){ return jsonSignal[key]});   
      var data = values[0];
    
      // get sheet by ID -  
      // you can get the sheet unqiue ID from the your current sheet url
      var jsonSheet = SpreadsheetApp.openById("Your Sheet UniqueID");  
      //var name = jsonSheet.getName();
    
      var sheet = jsonSheet.getSheetByName('Sheet1'); 
    
      // the column to put the data in -> Y
      var letter = "F";
    
      // start from line 
      var index = 4;
      data.forEach(function( row, index2 ) { 
    
         var keys = Object.keys(row);
         var value2 = row[keys[1]];            
    
         // set value loction
         var cellXY = letter +  index;      
         sheet.getRange(cellXY).setValue(value2);  
      
         index = index + 1;    
     });  
    }
    

    现在您需要添加一个每分钟执行一次的触发器。

    1. 转到项目触发器 -> 单击保存图标旁边的监视图标
    2. 添加触发器
    3. 在 -> 选择要运行的函数 -> GetStocksPrice
    4. 在 -> 选择事件源 -> 时间驱动
    5. 在 -> 选择基于时间的触发器类型 -> 分钟计时器
    6. 在 -> 选择分钟间隔 -> 每分钟

    还有你的套装:)

    【讨论】:

    • 您将如何修改它以便在每一行中保存(代码、价格)?目前只节省价格
    • @mchangun 你想要(股票代码,价格)在同一个单元格还是不同的单元格? (例如:股票 H1 价格 H2)
    • 不同的单元格,就在价格的左边。谢谢!
    【解决方案4】:

    我在加密更新方面遇到了类似的问题。解决此问题的一个笨拙的技巧是在单元格公式的末尾包含一个“+ now() - now()”特技,并按照上面的设置每分钟重新计算一次。这适用于我的价格更新,但绝对是一个丑陋的黑客。

    【讨论】:

    • 我正在尝试对 IMPORTDATA 公式执行相同的操作,但似乎无法在第一个公式中使用 NOW() 公式。你是怎么做到的?
    • 我也在尝试同样的方法,但没有任何运气!
    【解决方案5】:

    在任何单元格中使用 now()。然后将该单元格用作函数中的“虚拟”参数。 当 now() 每分钟更改一次时,公式会重新计算。 例子: someFunction(a1,b1,c1) * (cell with now() / cell with now())

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多