我有以下数据抓取脚本(使用Parse库):
function getData() {
var sheet = SpreadsheetApp.openById('my_id').getSheetByName('Sheet2');
var urls = sheet.getDataRange().getValues();
for(var i = 0; i < urls.length; i++) {
var sheet = SpreadsheetApp.openById('my_id').getSheetByName("Sheet5"); // insert Spreadsheet Id and Sheet name
var url = urls[i]
var fromText = '<span class="nb-shares">';
var toText = '</span>';
var content = UrlFetchApp.fetch(url).getContentText();
var scraped = Parser
.data(content)
.from(fromText)
.to(toText)
.build();
sheet.appendRow([ url,scraped ]);
}
}
它工作得很好但是我很难处理输出。我从sheet2的第一列中获取了我的网址,所以基本上是A1:A
,我想在同一张表中的B1:B
列中传递我的脚本的响应。
appendRow
只需复制同一列中的值,但要复制到我的网址列表下的行中。
答案 0 :(得分:1)
您不需要拨打sheet
两次,我看到一个是sheet2而另一个是sheet5。这是正确的还是你只是想在sheet2上像你说的那样?如果只是sheet2,请删除for循环中的var sheet
,然后尝试sheet.getRange(i+1,2).setValue(scraped)
这应该适用于你正在做的事情,但是如果你把响应放在一个数组中然后你的脚本会运行得更快之后将该数组设置为工作表。任何时候脚本与工作表进行通信都需要时间,这就是我们尝试减少调用工作表的时间的原因。
要做到这一点:
function getData() {
var sheet = SpreadsheetApp.openById('my_id').getSheetByName('Sheet2');
var urls = sheet.getDataRange().getValues();
var myNewArray = [];
for(var i = 0; i < urls.length; i++) {
var url = urls[i]
var fromText = '<span class="nb-shares">';
var toText = '</span>';
var content = UrlFetchApp.fetch(url).getContentText();
var scraped = Parser
.data(content)
.from(fromText)
.to(toText)
.build();
myNewArray.push([scraped]);
}
sheet.getRange(1,2,myNewArray.length,1).setValues(myNewArray);
}
这是一个更快的程序,你不会遇到谷歌在其脚本上的6分钟限制。
两种不同的方法,但如果您要做的只是将响应放在URL的一侧,您可以使用我在第一部分中展示的代码。