如何获取Google表格以自动更新对其他表格的引用?


20

我正在使用外部应用程序将数据输入到Google Spreadsheet中。然后,该单独的工作簿(带有IMPORTRANGE(spreadsheet_key, range_string)函数)将引用该工作簿,该工作簿可处理和解释数据。我的问题是,每当我个人修改引用的工作簿时,引用工作簿就可以很好地进行更新,但是每当外部应用程序对其进行修改时,它都不会得到更新。

我尝试编辑“电子表格设置”,以便每分钟和每次更改都进行重新计算。此外,我还在Google Chrome浏览器中安装了一个扩展程序,该扩展程序每小时自动刷新一次页面。但是,不会从引用的工作簿中重新导入数据。即使我将公式复制到新的单元格中,数据仍然不会重新导入。

我可以对参考工作簿执行任何操作来触发Google表格重新导入数据吗?

编辑:为了清楚起见,我目前有一个工作簿,其中有外部应用程序输入的数据(称为“源工作表”),另一个工作簿中有IMPORTRANGE功能(称为“参考工作表”)。IMPORTRANGE自上次我亲自编辑“源表”以来,“参考表”中该功能显示的数据不包括外部应用程序输入的任何数据。此外,两个工作簿都使用新的Google表格。

编辑:另外,此问题与我如何将Google Spreadsheets中的单元格链接到另一个文档中的单元格不同?因为我正在使用给定的功能作为该问题的解决方案,以便从电子表格中导入数据。问题不在于如何导入数据,而在于如何更新数据源。我的假设是Google会替我解决这个问题,但是“参考表”中的数据不会更新,而我发现要对其进行更新的唯一方法是亲自进入“源表”。 ”,然后自己编辑。


我不知道其工作方式的详细信息,但使用的是以下内容:ifttt.com/google_drive
tlewis3348 2014年

@pnuts您能否解释“确保使用正确的版本作为源”的含义?我将两个工作表的设置都设置为每分钟更新,而选项卡设置为每分钟刷新。我如何,在哪里以及在哪张纸中更新源代码?
tlewis3348

@pnuts好吧,数据可以正常显示separate workbook。从外表,它看起来就像是在刚刚输入。
tlewis3348

是的,这是新的Google表格。一个工作簿显示添加的数据,而另一个工作簿则不显示。我将其添加到原始问题中以进行澄清。
tlewis3348 2014年

Answers:


14

我一直在努力解决同样的问题。我没有编写自定义函数,而是向其中添加了一个不同的查询字符串,spreadsheet_urlIMPORTRANGE希望每次刷新页面时Google都认为它需要从新的电子表格中获取数据。我只是附加一个新的时间戳,以使URL每次都是唯一的。这是一个公然的骇客,但它在很多方面都为我工作。

我的公式以前看起来像:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/123123123123/edit#gid=1816927174","'Sheet1'!A1:B25")

现在看起来像:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/123123123123/edit#gid=1816927174"&"?"&now(),"'Sheet1'!A1:B25")

更新:

这种方法不再适用,因为谷歌将不再允许now()importrange()。请参阅下面来自休的评论。


6
当我尝试做同样的事情时,我遇到了这个答案。看起来Google做到了这一点,因此now(),rand()和randbetween()不能在importrange()调用中使用。

如果我将电子表格设置为每分钟更新一次,该公式也会刷新并获取新数据(如果有)吗?
Nikhil Sahu

5

以下是Jimmy在此Web Apps答复中提供的

  1. 在两个电子表格中,=now()在随机单元格中插入一个方程式,例如Z1
  2. 在两个电子表格中插入一个=importrange()引用now另一个电子表格功能的函数。
  3. 进入电子表格设置,然后选择每分钟重新计算一次。

我尝试了许多其他建议,包括使用=now()函数,此线程中的URL技巧或Apps脚本在设定的时间间隔内插入随机文本,但是除了手动编辑源工作表外,没有什么会迫使importrange更新。


在2018
MalcolmOcean

4

我发现最简单的方法是ifimportrange。周围放一个简单的语句。

B1 = Sheet ID
B2 = Sheet Name and Range
B3 = Now()
=if (B3> now()-1, IMPORTRANGE(B1,B2),)

每次都有效。


我一直在尝试实现您的解决方案,但是我不清楚如何使用B3。您是说B3 = Now()然后=if (Now() > now()-1, IMPORTRANGE(B1,B2),)
尤金·范德默

3

datestamp解决方法似乎对我不起作用-明确指出,不允许使用datestamps和rand函数。

我非常骇人的解决方法是删除单元格,然后按ctrl + z。每次都强制刷新。编写此onopen脚本或在特定时间间隔编写脚本以保持数据新鲜是微不足道的。


2

我发现了一个简单的技巧,可以模拟手动单元格更新并在外部电子表格中启动修改。

  1. 创建了一个这样的自定义函数:

    // Hack function used just to simulate a manual update
    function hack(value) {
      var list = []
      list.push(value);
      return list;
    }
    
  2. 然后,在我的工作表上,我这样称呼它:

    =arrayformula(hack(tab!B1))
    

    tab!B1我通过代码修改的单元格之一在哪里?


这如何模拟手动单元更新?
haemse '17

2

或者...您可以做一个简单的脚本,首先给值cero(0),然后再返回公式,这可以解决问题:

  var cell = sheet.getRange("B1:B1"); //SHEET TO INSERT VALUE
  cell.setFormula("=0");
   Utilities.sleep(2000); //JUST TO GIVE TIME TO UPDATE (OPTIONAL)
  var cell = sheet.getRange("B1:B1");
  cell.setFormula("=ImportRange(\"YOUR_SHEET_ID\",\"RANGE_TO_INSERT\")");  

甚至更好的将cell.setFormula( “=” &cell.getValue());,所以用户不会看到零2秒....
托尼BenBrahim

1

我能够找到一种使用具有自定义功能的Apps脚本解决我的问题的方法(在此处详细介绍 )。

如果更换=IMPORTRANGE(spreadsheet_url, range_string)您的电子表格=DynamicImportRange(spreadsheet_url, sheet_name, range)和下面的代码粘贴到工具- >脚本编辑器- >空白项目,它应该工作(见的详细信息,编写应用程序脚本)。

/**
Usage: =DynamicImportRange(spreadsheet_url, sheet_name, range)
Compare to: =IMPORTRANGE(spreadsheet_url, range_string)

Where the given arguments are placeholders that should be replaced
by arguments specific to your use-case.
 */
function DynamicImportRange(sheet_url, sheet_name, sheet_range) {
  var values = SpreadsheetApp.openByUrl(sheet_url).getSheetByName(sheet_name).getRange(sheet_range).getValues();
  return values
};

/**
*/
function RefreshSheet() {
  // Update the following two variables to suit your particular situation
  var sheet_name = "sample_sheet_sheet"
  var range = "A1"

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
  var formula1 = "Loading...";
  var formula2 = sheet.getRange(range).getFormula().toString().replace('"', '\"');
  // The following assumes that the data is being inserted into the sheet in the same
  // location as it is in in the source sheet.
  var form_range = formula2.split(",")[2].split("\"")[1];
  sheet.getRange(form_range).clear();
  sheet.getRange(range).setValue(formula1);
  Utilities.sleep(245);
  sheet.getRange(range).setValue(formula2);
};

如果要定期更新工作表,可以通过在“应用程序脚本”窗口中转到“资源->当前项目的触发器”来设置触发器。


4
至此为止的所有GOOGLE使用者:试算表自订功能无法使用SpreadsheetApp.openById()或开启(再)其他试算表SpreadsheetApp.openByUrl()在这里这里
Francesco Vadicamo

1

作为now()包版的一种解决方法,您可以将电子表格的设置更改为每小时更新一次。

文件->电子表格设置->计算

更新工作表以在“ 每小时更改一次 ”或“每分钟更改一次 ” 上重新计算自己。请记住,每分钟选择重新计算可能会使电子表格挂断。


0

您可以使用Google表格插件Sheetgo来自动更新其他表格的参考。您可以每月免费使用30个更新,也可以获取付费订阅以获取更多更新。该视频应向您介绍基本用法。


2
请记住,尽管它在“ 免费安装 ” 网站上进行了巧妙说明,但它是一个附加组件,其中包含一个有限的免费计划,然后是3个付费计划。定价页面的链接只能在网站的最底部找到。
marikamitsos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.