【问题标题】:Apps Script extremely slow or endlessly "Preparing for execution..."Apps 脚本极慢或无休止地“准备执行...”
【发布时间】:2018-12-05 11:52:34
【问题描述】:

我在我的 Google 表格文件上编写了一个非常简单的代码。这是目的:

  1. 从 StaticSheet 中保存一些需要复制到 DynamicSheet 中的单元格值(所有 Copyxxx)。
  2. 获取用户手动插入的特定单元格的值。
  3. 输入一个 While 循环,仅用于增加一个指示器并获取我想要复制之前保存的那些值的行号。
  4. 复制该行但不同列上的这些值。

问题在于,在我告诉它这样做之后,它似乎大多数时候甚至都没有运行脚本。 有趣的是,有时它可以工作,超级慢,但它可以工作几分钟。在它再次停止工作之后。

你能告诉我我在这里缺少什么吗?

function Copy_Static_on_Dynamic() {
  var app = SpreadsheetApp;
  var ss = app.openById("xxxxyy--------yyzzzz")
  var StaticSheet = ss.getSheetByName("DEAT Price");
  var DynamicSheet = ss.getSheetByName("DEAT Price + TEST");
  var CopySKU = StaticSheet.getRange(5,1,40);
  var CopyPrices = StaticSheet.getRange(5,3,40,4);
  var CopyUsage = StaticSheet.getRange(5,8,40);
  var Week_1 = StaticSheet.getRange(2,4).getValues();
  var i = 1;
  Logger.clear();
  while(DynamicSheet.getRange(i,3).getValues() != Week_1)
  {
   Logger.log(i);
    i+=1;
  }
  CopySKU.copyTo(DynamicSheet.getRange(i,4,40));
  CopyPrices.copyTo(DynamicSheet.getRange(i,6,40,4));
  CopyUsage.copyTo(DynamicSheet.getRange(i,11,40));
}

【问题讨论】:

标签: javascript performance google-apps-script google-sheets execution


【解决方案1】:

如果您在 Apps 脚本编辑器中看到“准备执行”消息,您可以重新加载浏览器窗口并再次运行该函数。该计划可能会消失。

【讨论】:

  • 这显然不能解决问题。目前在“执行”部分,我可以看到它是“正在运行”,但它正在无休止地进行。此外,如果我尝试插入任何断点进行调试,它永远不会到达它,即使我将它插入代码的第二行...... :(
  • 您看到的消息是因为您的脚本运行时间过长。您可能尝试手动取消它的执行,但服务器仍在多个实例上为您运行。在某些时候,运行任何脚本变得不可能,您只能等待,有时要等待几个小时。我知道由于 6 分钟的限制,这似乎不合逻辑,但我从经验中知道。
【解决方案2】:

所以我想我已经解决了。 正如 Serge insas 所说,我的脚本在后台运行,我在“执行”部分发现了它,您也可以在其中打断它们。 在我发现它之后,我继续测试,我发现 while 循环每次都需要将近 2 秒来检查条件,这使得脚本非常长。 所以而不是:

while(DynamicSheet.getRange(i,3).getValues() != Week_1)

...我创建了一个先前声明的变量,例如:

var WeekLOOP = DynamicSheet.getRange(i,3).getValues();
while(WeekLOOP != Week_1) { --- }

... 现在脚本需要几毫秒来运行条件。我没有足够的技术知识来说明这是否是唯一的问题,但这显然解决了我的问题。 感谢大家的支持!如果我需要任何进一步的帮助会回来:)

【讨论】:

    【解决方案3】:

    正如 Amit Agarwal 所说,要解决问题中提到的错误消息,请刷新网络浏览器选项卡。

    关于代码,

    开启

    var Week_1 = StaticSheet.getRange(2,4).getValues();

    DynamicSheet.getRange(i,3).getValues()

    您应该使用 getValue 而不是 getValues,因为您的代码指的是单个单元格,否则您将获得二维数组而不是标量值。

    应该非常小心地使用while,以避免函数无休止地运行。您可以添加一些“保障”,如下所示

    var max_iterations = 100 // Edit this while(DynamicSheet.getRange(i,3).getValue() != Week_1 && i <= max_iterations) {

    【讨论】:

    • 我发誓直到昨天还有 getValue,我刚刚更改,因为我在互联网上发现 getValues 用于字符串,而 getValue 用于日期。这只是一个尝试,我真的不知道它是否有区别。在第二种情况下,我应该只检查“ i ”变量的值而不是单元格的值吗?
    • 这很重要。关于第二个条件,你是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2014-08-04
    相关资源
    最近更新 更多