【问题标题】:Service invoked too many times in a short time: exec qps. - Google Sheets短时间内服务调用次数过多:exec qps。 - 谷歌表格
【发布时间】:2018-09-25 09:08:50
【问题描述】:

我一直在使用自定义函数将简单的数学分解为可读的 JavaScript,但出现以下错误:

服务在短时间内调用太多次:exec qps。在通话之间尝试Utilities.sleep(1000)。 (第 0 行)。

我曾尝试随机睡眠一段时间,但这无济于事。我的函数如下所示:

function conversationGrowthRate(clientCount, initialGrowthRate, conversationCount) {  
  //Utilities.sleep(Math.random() * 30000);
  for (var i = clientCount; i > 10; i--) {
    if (initialGrowthRate > 0) {
      conversationCount += initialGrowthRate
      initialGrowthRate -= 0.000003
    }
  }
  return conversationCount;
}

function conversionGrowth(clientCount, conversationCount, initialConversionRate, conversionGrowthRate, maxConversionRate, coversPerBooking, initialConversationGrowthRate, initialConversationCount) {
  //Utilities.sleep(Math.random() * 30000);
  if (clientCount <= 50) {
    return coversPerBooking * conversationCount * initialConversionRate;
  }
  else {
    var firstFiftyClientConversations = conversationGrowthRate(50,initialConversationGrowthRate, initialConversationCount)*30*50; //~30
    var additionalConversionGrowthRate = (clientCount-50) * conversionGrowthRate;
    var totalConversionRate = initialConversionRate + additionalConversionGrowthRate;
    var additionalClientConversations = conversationGrowthRate(clientCount-50, initialConversationGrowthRate, initialConversationCount) * 30 * (clientCount-50);
    if (totalConversionRate < maxConversionRate) {
      return coversPerBooking * ((firstFiftyClientConversations * initialConversionRate) + (additionalClientConversations * totalConversionRate));
    }
    else {
      return coversPerBooking * (conversationCount * maxConversionRate); 
    }
  }
}

function salesProductivity(currentExecs, prevMonthExecs, prevTwoMonthExecs, prevThreeMonthExecs, prevFourMonthExecs, salesPerExecPerMonth) {
  //Utilities.sleep(Math.random() * 30000);
  var firstMonthHires = currentExecs - prevMonthExecs;
  var secondMonthHires = prevMonthExecs - prevTwoMonthExecs;
  var thirdMonthHires = prevTwoMonthExecs - prevThreeMonthExecs;
  var fourthMonthHires = prevThreeMonthExecs - prevFourMonthExecs;
  var longerHires = prevFourMonthExecs;

  return (secondMonthHires * (0.33 * salesPerExecPerMonth)) + (thirdMonthHires * (0.66 * salesPerExecPerMonth)) + (fourthMonthHires * (1 * salesPerExecPerMonth)) + (longerHires * salesPerExecPerMonth);
}

在它开始工作之前我什么都没做。

【问题讨论】:

  • 能否将获取/设置值的脚本包含在单元格中?
  • 根据自定义函数的最佳实践,考虑重写以使用数组输入而不是单个单元格。 developers.google.com/apps-script/guides/sheets/…
  • @ThumChoonTat 像这样,例如:=conversationGrowthRate(B4,Summary!$G$29)*30*B4
  • @tehhowch 我不知道如何在我的用例中做到这一点。每个函数都依赖于工作表中的各种输入——这个例子没有多大帮助,我在尝试时仍然会出错。
  • @thum 我不推荐使用“on change”触发器。我建议能够使用从工作表到脚本的一次调用以及相应输入的数组,并让函数返回相应输出的数组。

标签: google-apps-script google-sheets custom-function


【解决方案1】:

Google 表格通过名为 exec 的服务远程运行自定义函数。如果对任何自定义函数有“太多”调用(根据一些未记录的配额,或者至少我没有找到任何此类文档),则会发出此错误。

如果由于许多单元格正在调用自定义函数而发生调用,我看不出Utilities.sleep(milliseconds) 有什么帮助,因为exec 会在sleep 之前被调用(实际上,它将是exec这将直接或间接调用sleep)。

正如一些 cmets 所提到的,将函数转换为接受范围并返回数组(并更改工作表以适应所述函数)是可行的方法(直到 Google 添加更智能的节流)。

【讨论】:

    【解决方案2】:

    这应该适用于任何达到使用配额的谷歌服务。

    while(true) {
      try {
        return '<whatever's hitting the quota>';
      }
      catch(error) {
        Utilities.sleep(1000);
      }
    }
    
    • 它没有放弃
    • 除非需要,否则不会造成延迟

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多