我最近拾取了一个Google表格文件,该文件可以让我在电子表格中多次使用ImportXML。 https://docs.google.com/spreadsheets/d/1VriaQ6QMq69Ya3734DKRBZ1eUBRd3B1jCD-P6DUHKLA/edit?usp=sharing
我遇到了一个脚本超时的问题,因为它必须经过太多的链接(目前不能超过250个链接),以至于达到脚本运行时限制。
我想知道是否有办法关闭脚本运行时限制,或者让它每5分钟重新启动一次。在我刚开始学习脚本时,我目前并不擅长应用脚本,并希望有人可以为我指出正确的方向。
我链接了上面的电子表格(出于保护原因,提供了示例链接)。但是,如果您想看一下,这是正在为工作表运行的代码:
function bulkXml() {
var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = sheet.getLastRow()
var Num = sheet.getRange(2, 1, lastRow, 1).getValues();
Num = Num.filter(function(u) {
return u[0].length > 2
})
// Logger.log(a)
// return false
for (var y = 0; y < 2; y++) {
for (var x = 2; x - 2 < Num.length; x++) {
var url = sheet.getRange(x, 1).getValue();
sheet.getRange(2, 6).setValue(url);
var xpathResult = sheet.getRange(3, 6).getValue();
var counter = x - 1;
sheet.getRange("C4").setValue(" PLEASE WAIT...CURRENTLY FETCHING " + counter + " OUT OF " + Num.length);
if (y === 1) {
sheet.getRange(x, 2).setValue(xpathResult);
sheet.getRange("C4").setValue("PROCESSED " + counter + " OUT OF " + Num.length);
SpreadsheetApp.flush();
}
}
}
}
答案 0 :(得分:0)
您所要做的就是将公式嵌套在if语句中,例如……例如,假设您在单元格A1中有一个importxml,想在单元格B1中加载更多,依此类推。 。这样,直到第一个完成执行后,下一个才会执行。
=if(iferror(A1,"")="Loading...","",importxml(
答案 1 :(得分:0)
我认为绕过6分钟时限的一个好方法是将操作分成几个部分,并在每个部分的末尾创建一个基于时间的触发器,该触发器将在指定的时间后调用以下部分时间。
此处要注意的方法是after(durationMilliseconds)。因此,您可以在指定的毫秒数后运行指定的任何功能。
在这种情况下,此解决方法会进一步复杂化,因为您处于循环内,并且没有明确的位置可以将函数分为几部分。
(1)一种选择是在每次迭代之后(或在指定的迭代次数之后)计算脚本中的执行时间,如果该执行时间接近6分钟的时间限制,请停止脚本并创建一个触发,将再次调用该函数。
(2)另一个选择是或多或少地知道6分钟内可以进行多少次迭代,然后停止该函数,并在经过多次迭代后再次调用它。
这个想法是,每次触发该函数时,它将从其保留的位置恢复循环。在这种情况下,下次调用该函数时(使用上面指定的基于时间的触发器),它将需要有关我们位于循环的哪个部分的信息:即x
和{{ 1}}索引。
下面是基本上完成所有这些操作的代码示例。但是,关于此样本,必须考虑以下几点:
y
,因为我不明白其用途。如果需要,则必须对此代码进行一些修改以包含它。for
)。但是我每次都使用工作表本身来存储和检索值,以便更轻松地跟踪它。x
我希望这会有所帮助。