当前位置: 首页 > 知识库问答 >
问题:

刷新Google Sheet中自定义函数检索的数据

穆铭晨
2023-03-14

我写了一个自定义的谷歌应用脚本,它将接收一个id并从网络服务中获取信息(价格)。

我在电子表格中使用这个脚本,它工作得很好。我的问题是,这些价格会发生变化,而我的电子表格不会得到更新。

如何强制它重新运行脚本并更新单元格(而不手动检查每个单元格)?

共有3个答案

巫墨一
2023-03-14

有一些设置,您可以使now()自动更新:

太叔京
2023-03-14

我所做的与tbkn23相似。除进行更改外,此方法不需要任何用户操作。

我想重新计算的函数有一个额外的未使用参数,$A$1。所以函数调用是

=myFunction(firstParam, $A$1)

但在代码中,函数签名是

function myFunction(firstParam)

我没有使用刷新函数,而是使用了如下的onEdit(e)函数

function onEdit(e)
{
   SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());
}

每当编辑电子表格中的任何单元格时,都会触发此功能。因此,现在您编辑一个单元格,在A1中放置一个随机数,这将按照tbkn23的建议刷新参数列表,导致重新计算自定义函数。

公良泰宁
2023-03-14

好吧,我的问题似乎是谷歌的行为很奇怪——只要脚本参数相似,它就不会重新运行脚本,而是使用以前运行的缓存结果。因此,它不会重新连接到API,也不会重新获取价格,它只是返回缓存的上一个脚本结果。

在这里查看更多信息(如果您受到影响,请在这些问题上添加一颗星星):

  • https://issuetracker.google.com/issues/36753882
  • https://issuetracker.google.com/issues/36763858

此处:用于汇总未更新数据的脚本

我的解决方案是在我的脚本中添加另一个参数,我甚至不用它。现在,当您使用与以前调用不同的参数调用函数时,它必须重新运行脚本,因为这些参数的结果将不在缓存中。

因此,无论何时调用函数,对于额外的参数,我都会传递“$A$1”。我还创建了一个名为refresh的菜单项,当我运行它时,它会将当前日期和时间放在A1中,因此所有以$a$1作为第二个参数的脚本调用都必须重新计算。以下是我脚本中的一些代码

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Refresh",
    functionName : "refreshLastUpdate"
  }];
  sheet.addMenu("Refresh", entries);
};

function refreshLastUpdate() {
  SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(new Date().toTimeString());
}

function getPrice(itemId, datetime) {
  var headers =
      {
        "method" : "get",
        "contentType" : "application/json",
        headers : {'Cache-Control' : 'max-age=0'}
      };

  var jsonResponse = UrlFetchApp.fetch("http://someURL?item_id=" + itemId, headers);
  var jsonObj = eval( '(' + jsonResponse + ')' );
  return jsonObj.Price;
  SpreadsheetApp.flush();
}   

当我想把ID为5的商品的价格放在一个单元格中时,我使用以下公式:

=getPrice(5, $A$1)

当我想刷新价格时,我只需点击“刷新”-

 类似资料:
  • XQuery提供编写自定义函数的功能。 下面列出了创建自定义函数的准则。 使用关键字来定义函数。 使用当前XML架构中定义的数据类型 将函数体包含在花括号内。 使用XML命名空间前缀函数的名称。 创建自定义函数时使用以下语法。 语法 示例 以下示例显示如何在XQuery中创建用户定义的函数。 XQuery表达式 输出结果 - 验证结果 要测试上述函数,用上面的XQuery表达式替换books.xq

  • 我在理解group_by如何在tidyverse中工作时遗漏了一些东西。示例将阐明: 我已经创建了下面的函数,它采用很少的参数,并计算tibble内部的最佳权重(可能不是最漂亮的,但似乎工作): 当我在tibble中只有一个组时,这个函数可以很好地工作。我创建函数的方法是尝试通过在一个函数上进行测试来实现它,希望在我稍后对数据进行切片时它会起作用。 然后,我希望可以使用mutate为我的多个组创建

  • 2. 自定义函数 我们不仅可以调用C标准库提供的函数,也可以定义自己的函数,事实上我们已经这么做了:我们定义了main函数。例如: int main(void) { int hour = 11; int minute = 59; printf("%d and %d hours\n", hour, minute / 60); return 0; } main函数的特殊之处在于执行程序时它自动

  • 新的/当前的问题是,在不到3秒的时间内添加几个div可能会导致div只出现一秒或更短的时间,无法看到它是什么。有办法解决吗??

  • 我做了这个自定义函数,并把它放在全局之外,这通常会工作。我也试着在主异步木偶函数中移动它,但也不起作用。这是一个简单的函数。在每个page evaluate函数中,我调用它并传递选择器。但是,它的说法没有定义和promise拒绝,这是奇怪的,因为函数不是promise....请帮助 我尝试将函数转换为异步函数,添加了一个新的参数页。然后,我将async添加到我的评估函数中,然后将puppeteer

  • 我正在使用 Scala,并希望构建自己的数据帧函数。例如,我想将一列视为数组,循环访问每个元素并进行计算。 首先,我尝试实现自己的getMax方法。因此列x的值为[3,8,2,5,9],该方法的预期输出为9。 下面是它在Scala中的样子 这是我目前所知道的,并得到这个错误 我不知道如何迭代该列。 } 一旦我能够实现自己的方法,我将创建一个列函数 然后我希望能够在SQL的陈述中使用它 给定输入列[