Google apps script 谷歌脚本-脚本超时

Google apps script 谷歌脚本-脚本超时,google-apps-script,Google Apps Script,我对编程了解不多,但我为我的一个电子表格创建了一个脚本,几个月前它运行得很好。 但最近,无论脚本多么简单,都无法使用。有时它能在1到2秒钟内完美运行,而大多数时候它只是超时并失败。90%的执行会导致“超时” 总之,每次编辑电子表格的B列或C列时都必须执行该功能。为此,我使用了函数OnEdit()。 编辑B列时,日期和时间将插入发生更改的相应行的D列中。 编辑C列时,日期和时间将插入到发生更改的相应行的E列中 代码如下: function onEdit(e) { var column = e

我对编程了解不多,但我为我的一个电子表格创建了一个脚本,几个月前它运行得很好。 但最近,无论脚本多么简单,都无法使用。有时它能在1到2秒钟内完美运行,而大多数时候它只是超时并失败。90%的执行会导致“超时”

总之,每次编辑电子表格的B列或C列时都必须执行该功能。为此,我使用了函数OnEdit()。 编辑B列时,日期和时间将插入发生更改的相应行的D列中。 编辑C列时,日期和时间将插入到发生更改的相应行的E列中

代码如下:

function onEdit(e) 
{
  var column = e.range.getColumn();
  var aba = e.source.getActiveSheet().getName();



 if (column == 2 && aba == "Controle")
  {
      var ss = SpreadsheetApp.getActiveSheet();
      var cell = ss.getActiveCell();

     if(cell.getValue() != "")
     {
      var add = cell.offset(0, 2);
        var data = new Date();
        data = Utilities.formatDate(data, "GMT-03:00","dd/MM/yyyy' 'HH:mm' '");
        add.setValue(data);
     }
     else
     {
       var add = cell.offset(0, 2);
        var data = new Date();
        data = "";
        add.setValue(data);
     }
  }
  if (column == 3 && aba == "Controle")
  {
      var ss = SpreadsheetApp.getActiveSheet();
      var cell = ss.getActiveCell();
      
      if(cell.getValue() == true)
      {
        var add = cell.offset(0, 2);
        var data = new Date();
        data = Utilities.formatDate(data, "GMT-03:00","dd/MM/yyyy' 'HH:mm' '");
        add.setValue(data);
      }
      else
      {
        var add = cell.offset(0, 2);
        var data = new Date();
        data = "";
        add.setValue(data);
      }
  }
}
即使是超级简单的录制宏(如应用过滤器)也显示了这个问题

我想知道在代码中是否可以做一些事情来提高解决这个问题的效率,或者所遇到的超时问题是否与其他问题有关

谢谢

试试这个:

function onEdit(e) {
  const sh=e.range.getSheet();
  if(sh.getName()=='Controle' && e.range.columnStart>1 && e.range.columnStart<4)  {
    if(e.range.columnStart==2) {
      if(e.value='') {
        e.range.offset(0,2).setValue(Utilities.formatDate(new Date(), "GMT-3", "dd/MM/yyyy' 'HH:mm' '"));
      }else{
        e.range.offset(0,2).setValue(new Date());                           
      }
    }
    if(e.range.columnStart==3) {
      if(e.value==true) {
        e.range.offset(0,2).setValue(Utilities.formatDate(new Date(), "GMT-3", "dd/MM/yyyy' 'HH:mm' '"));
      }else{
        e.range.offset(0,2).setValue(new Date());
      }
    }
  }
}
函数onEdit(e){
const sh=e.range.getSheet();

如果(sh.getName()=='Controle'&&e.range.columnStart>1&&e.range.columnStart基于您的日志,您的脚本将达到配额,超过最大执行时间,尽管您的场景中也可能同时执行30多次,这将使脚本无法运行

正如Cooper在评论中所说,一种解决方法是对脚本的某些部分实施锁定,特别是对电子表格进行更改的部分,以使后续执行等待一个脚本完成

示例代码:

function onEdit(e) 
{
  var column = e.range.getColumn();
  var aba = e.source.getActiveSheet().getName();

  var lock = LockService.getScriptLock();
  
  try { lock.waitLock(10000); } // wait 10 sec

 if (column == 2 && aba == "Controle")
  {
      var ss = SpreadsheetApp.getActiveSheet();
      var cell = ss.getActiveCell();

     if(cell.getValue() != "")
     {
      var add = cell.offset(0, 2);
        var data = new Date();
        data = Utilities.formatDate(data, "GMT-03:00","dd/MM/yyyy' 'HH:mm' '");
        add.setValue(data);
     }
     else
     {
       var add = cell.offset(0, 2);
        var data = new Date();
        data = "";
        add.setValue(data);
     }
  }
  if (column == 3 && aba == "Controle")
  {
      var ss = SpreadsheetApp.getActiveSheet();
      var cell = ss.getActiveCell();
      
      if(cell.getValue() == true)
      {
        var add = cell.offset(0, 2);
        var data = new Date();
        data = Utilities.formatDate(data, "GMT-03:00","dd/MM/yyyy' 'HH:mm' '");
        add.setValue(data);
      }
      else
      {
        var add = cell.offset(0, 2);
        var data = new Date();
        data = "";
        add.setValue(data);
      }
  }

  SpreadsheetApp.flush(); // applies all pending spreadsheet changes
  lock.releaseLock();
}
参考文献:

function onEdit(e) 
{
  var column = e.range.getColumn();
  var aba = e.source.getActiveSheet().getName();

  var lock = LockService.getScriptLock();
  
  try { lock.waitLock(10000); } // wait 10 sec

 if (column == 2 && aba == "Controle")
  {
      var ss = SpreadsheetApp.getActiveSheet();
      var cell = ss.getActiveCell();

     if(cell.getValue() != "")
     {
      var add = cell.offset(0, 2);
        var data = new Date();
        data = Utilities.formatDate(data, "GMT-03:00","dd/MM/yyyy' 'HH:mm' '");
        add.setValue(data);
     }
     else
     {
       var add = cell.offset(0, 2);
        var data = new Date();
        data = "";
        add.setValue(data);
     }
  }
  if (column == 3 && aba == "Controle")
  {
      var ss = SpreadsheetApp.getActiveSheet();
      var cell = ss.getActiveCell();
      
      if(cell.getValue() == true)
      {
        var add = cell.offset(0, 2);
        var data = new Date();
        data = Utilities.formatDate(data, "GMT-03:00","dd/MM/yyyy' 'HH:mm' '");
        add.setValue(data);
      }
      else
      {
        var add = cell.offset(0, 2);
        var data = new Date();
        data = "";
        add.setValue(data);
      }
  }

  SpreadsheetApp.flush(); // applies all pending spreadsheet changes
  lock.releaseLock();
}


英语是这里的通用语言。像这样的简单触发器必须在30秒内完成。您可以尝试一个可安装的触发器,我不知道它们的最长执行时间是多少。您可以通过学习如何最大限度地利用事件对象参数来简化代码。要了解更多信息,请将此代码放在开头附近调用函数.Logger.log(JSON.stringify(e))并在执行日志中查看结果。下面是报告:{“用户”:“电子邮件”:“,“昵称”:“}”,oldValue:“假”,“源”:},“authMode:“有限”,“值”:“真”,“范围”:{“columnEnd”:3,“columnStart”:3,“rowEnd”:91,“rowStart”:91}}超过最大执行时间我无法通过调试器,因为它给出了一个错误:TypeError:无法读取未定义的onEdit@Código.gs:5的属性“range”。此错误仅在调试器中发生。如果我直接通过电子表格运行,则不会发生此错误。不幸的是,它不起作用。它似乎与代码无关电子表格至少与3个人共享,并且经常进行编辑(大约每分钟连续编辑10次)。这会是谷歌为请求太多脚本设置的限制吗?我真的不知道,因为有时候一切都正常快速运行,突然一切都停止了。我没有发现任何人有同样的问题。你说它不起作用是什么意思。请提供更多解释。我使用onEdits的经验是,如果你有太多人同时进行编辑,但它无法跟上。您可能可以使用可安装的触发器和锁定服务。但我猜这不值得麻烦。我认为它总是很难跟上人们的键入速度。我唯一一次使用它是在只有一个人运行它的情况下。我更喜欢为用户使用web界面。这样,您可以让他们通过相同的读写功能,并使用锁定服务来禁止同时使用相同的脚本。“您说它不起作用是什么意思。请提供更多解释”抱歉,我会更好地解释。您的代码工作得很好。谢谢,效率更高。但是,超时问题仍然存在。我认为这一定是因为正如您所描述的,它正被多个用户使用。使用锁定服务并没有解决问题。我删除了共享,甚至只有我自己编辑。问题仍然存在。我看到确实存在是30个同时操作的限制,但即使我只执行一个操作,问题仍然存在。我使用可安装触发器进行了一些改进。出于某些原因,它更持久,并且在完成之前不会终止脚本。有时每次运行大约需要100秒。有时脚本在不到100秒内执行2秒,然后再次延迟。我找不到解释。至少对于可安装触发器,即使运行一段时间而不显示“超时”。另一件改进的事情,我不知道这是否是巧合,我从侧面的工作表中删除了一些数组公式。出于某种原因,它得到了改进,尽管此工作表与脚本中的数据没有直接关系。我不知道,但它得到了改进。感谢卡洛斯和库珀的帮助