IMPORTRANGE(spreadsheet_key, range_string)
功能)将引用该工作簿,该工作簿可处理和解释数据。我的问题是,每当我个人修改引用的工作簿时,引用工作簿都可以正常更新,但是每当外部应用程序对其进行修改时,它都不会更新。我尝试编辑“电子表格设置”这样,每分钟和每次更改都会进行重新计算。此外,我还在Google Chrome浏览器中安装了一个扩展程序,该扩展程序每小时自动刷新页面。但是,不会从引用的工作簿中重新导入数据。即使我将公式复制到新的单元格中,数据仍然不会重新导入。
我可以对引用工作簿执行任何操作来触发Google表格重新导入数据吗?
编辑:为清楚起见,我目前有一个工作簿,其中有外部应用程序输入的数据(称为“源工作表”),另一工作簿中有
IMPORTRANGE
函数(称为它是“参考表”)。自从我上次亲自编辑“源工作表”以来,“参考工作表”中的IMPORTRANGE
函数显示的数据不包括外部应用程序输入的任何数据。另外,两个工作簿都使用新的Google表格。编辑:另外,此问题与我如何将Google Spreadsheets中的单元格链接到另一个文档中的单元格不同?因为我正在使用给定的功能作为该问题的解决方案,以便从电子表格中导入数据。问题不在于如何导入数据,而在于如何更新数据源。我的假设是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")
如果需要许可,请允许。
评论
我不知道其工作方式的详细信息,但使用的是以下内容:ifttt.com/google_drive@pnuts您能否解释“确保使用正确的版本作为源”的含义?我将两个工作表的设置都设置为每分钟更新一次,并且将选项卡设置为每分钟刷新一次。我如何,在哪里以及在哪张纸中更新源代码?
@pnuts好吧,数据正在单独的工作簿中显示。从所有外观看,它似乎都是刚刚输入的。
是的,这是新的Google表格。一个工作簿显示添加的数据,而另一个工作簿则不显示。我会将其添加到原始问题中以进行澄清。