删除/解决Google表格的运行时限制

时间:2019-11-14 09:18:02

标签: google-apps-script google-sheets google-sheets-importxml

我最近拾取了一个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();
            }

        }

    }

}

2 个答案:

答案 0 :(得分:0)

您所要做的就是将公式嵌套在if语句中,例如……例如,假设您在单元格A1中有一个importxml,想在单元格B1中加载更多,依此类推。 。这样,直到第一个完成执行后,下一个才会执行。

=if(iferror(A1,"")="Loading...","",importxml(

答案 1 :(得分:0)

我认为绕过6分钟时限的一个好方法是将操作分成几个部分,并在每个部分的末尾创建一个基于时间的触发器,该触发器将在指定的时间后调用以下部分时间。

此处要注意的方法是after(durationMilliseconds)。因此,您可以在指定的毫秒数后运行指定的任何功能。

在这种情况下,此解决方法会进一步复杂化,因为您处于循环内,并且没有明确的位置可以将函数分为几部分。

(1)一种选择是在每次迭代之后(或在指定的迭代次数之后)计算脚本中的执行时间,如果该执行时间接近6分钟的时间限制,请停止脚本并创建一个触发,将再次调用该函数。

(2)另一个选择是或多或少地知道6分钟内可以进行多少次迭代,然后停止该函数,并在经过多次迭代后再次调用它。

这个想法是,每次触发该函数时,它将从其保留的位置恢复循环。在这种情况下,下次调用该函数时(使用上面指定的基于时间的触发器),它将需要有关我们位于循环的哪个部分的信息:即x和{{ 1}}索引。

下面是基本上完成所有这些操作的代码示例。但是,关于此样本,必须考虑以下几点:

  • 我删除了外部y,因为我不明白其用途。如果需要,则必须对此代码进行一些修改以包含它。
  • 可以使用Properties Service或您喜欢的任何其他工具来存储有关索引的信息(或在本示例中,索引for)。但是我每次都使用工作表本身来存储和检索值,以便更轻松地跟踪它。
  • 在此示例中,我使用了方法(2)(我定义了在脚本停止并再次被调用之前要执行的迭代次数,在这种情况下为25)。相应地更改。
x

我希望这会有所帮助。