《googlesheet-抓取数据之突破数量限制和强制刷新》

如果A1格抓取了一个股价数据,A1 =importxml(url,xpath),你要求它每10分钟自动刷新一次,也就是重新抓取一次,该怎么做?

之前的文章说到,正常情况下importxml半小时到一小时才会自动刷新。如果把url改成 url#test1这样的格式,等于是改变了抓取地址,可以,要求强制刷新。

那么,可否将url写成”url#test”&minute(now()),这样的格式要求它每分钟刷新呢?答案是不可以,import类的函数里不允许出现时间、日期函数。

下面写一下我的实现步骤,可以做到每10分钟刷新,并且指定在哪一分钟刷新。

1、新建一个表格,A1写=minute(now()),取当前的分钟数。

2、在A2写=int(A1/10),取当前分钟数的十位数

2、在A3写=A1-A2*10,取当前分钟数的个位数

3、在A4写=if(A3<8,true,false),当分钟的个位数为8和9的时候为false,其他为ture

4、在A5写=if(A4,A2,if(A2=5,0,A2+1))

A5格最终的效果是,

在分钟数是0,1,2,3,4,5,6,7的时候,都显示分钟的十位数,

在分钟数是8,9的时候,显示分钟的十位数+1(如果分钟的十位数当前是9,则显示0),

也就是在分钟数的个位数为8的时候,A5的数据会变化

5、到这里为止,这个变化的数据并没有用,如果直接附加到url之后,数据抓取会报错

现在要设置一个时间触发器timetigger,点击表格的菜单-工具-脚本编辑器,新建脚本

function createTimeDrivenTriggers() {
ScriptApp.newTrigger(“myFunction”)
.timeBased()
.everyMinutes(1)
.create();
}

保存并运行之后创建了一个每分钟执行的时间触发器,用来触发自定义函数myFunction

6、再新建一个脚本,每分钟在A6格子里写上一个由random函数生成的随机数。

function myFunction() {

SpreadsheetApp.getActiveSheet().getRange(“A6”).setValue(Math.random());

}

这个没有意义的步骤其实是最重要的。因为,如果不让表格每分钟做点什么,它就不能正确返回每分钟前面A1-A5的结果。即使用onchange函数也没用。

7.现在会到你要抓取数据的表格,假设你已经为每个importxml之类的公式里的url后面都加上了#test

现在url是 url#test的格式,这时你在A1输入=importrange(“第一步中新建表格的url”,”工作表1!A5:A5”),把那个表格中的A5格子引用到这张表格的A1。

这时,把importxml函数里的url后面再加上A1,也就是url变成url#test&A1

举个抓取标普指数的实例,比如B2里写上

=importxml(“https://www.investing.com/indices/s-p-500-tr”  &  “#test”  & ‘工作表1’!A1,“//span[@id=’last_last’]”)

这样B2就会每10分钟重新抓取一次,并且在第8分钟抓取。

 

说点什么