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

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

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

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

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

评论

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

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

@pnuts好吧,数据正在单独的工作簿中显示。从所有外观看,它似乎都是刚刚输入的。

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

#1 楼

我一直在努力解决同样的问题。我没有编写自定义函数,而是向spreadsheet_url中的IMPORTRANGE添加了一个不同的查询字符串,以希望每次刷新页面时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")


更新:

此方法不再起作用,因为Google不再允许在now()内部使用importrange()。请参阅下面来自休的评论。

评论


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

–休
17年6月22日在16:05

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

– Nikhil Sahu
19年1月11日,9:54

#2 楼

以下是Jimmy在此Web Apps答案中提供的信息。


在两个电子表格中的随机单元格中插入=now()方程,例如Z1

在两个电子表格中插入一个请参考其他电子表格的=importrange()函数。
进入电子表格设置并选择每分钟重新计算一次。

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

评论


在2018年12月为我工作

– MalcolmOcean
18/12/4在3:07

在2020年1月为我工作

–user1114
20年1月14日在5:18

#3 楼

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

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),)

– Eugene van der Merwe
17年8月19日在7:47

#4 楼

datetamp解决方法似乎不适用于我-有一个明确的说明,不允许使用datestamps和rand函数。

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

#5 楼

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



创建了一个自定义函数,如下所示:

// Hack function used just to simulate a manual update
function hack(value) {
  var list = []
  list.push(value);
  return list;
}



然后,在我的工作表上,我这样称呼它:

=arrayformula(hack(tab!B1))


其中tab!B1是单元格之一通过代码修改。



评论


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

– haemse
17年8月6日在2:19

#6 楼

或者...您可以做一个简单的脚本,首先给值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秒钟内看不到零...。

– Tony BenBrahim
18年5月15日在0:39

#7 楼

我能够找到一种使用具有自定义功能的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);
};


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

评论


在此结束,对于所有GOOGLE使用者:电子表格自定义函数无法使用SpreadsheetApp.openById()或SpreadsheetApp.openByUrl()打开(再)其他电子表格。在这里和这里检查

– Francesco Vadicamo
16年3月30日在21:06

#8 楼

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

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

更新工作表以重新计算本身在“每时每刻都在变化”或“每时每刻都在变化”。请记住,每分钟选择重新计算可能会使电子表格挂断。

#9 楼

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

评论


请记住,尽管它在“免费安装”网站上有明确说明,但它是一个附加组件,其中包含一个有限的免费计划,其次是3个付费计划。定价页面的链接只能在网站的最底部找到。

– marikamitsos
16年7月27日在16:20

#10 楼

您可以记录一个宏,该宏将删除工作表中的所有值,然后将IMPORTRANGE公式粘贴回所需的单元格中。

这样,您将宏设置为快捷方式,而不是刷新它。

不理想,但可以工作

研究如何使宏每分钟或通过按钮运行。不知道怎么办。

#11 楼

现在,使用它非常容易。

您需要像下面的格式一样使用此功能。

=IMPORTRANGE("spreadsheet_url", "Name of Sheet you want to copy!Range" )


下面的示例

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/", "Form Responses 1!A1:B1000")


如果需要许可,请允许。