首页 > 解决方案 > 谷歌的脚本总是那么慢吗?

问题描述

我为 Google 表格写了一个小脚本。每当我在表中添加新内容时,都会添加新值。如果我快速执行此操作(输入一个值并直接按 Enter 键以便进入下一行),则脚本不会跟上并遗漏值(行)。有没有人遇到过这个问题并且知道如何解决它?

我不关心它实际上是如何工作的,只关心如何让这些行在 Google 表格中运行得更快。

function addDateTimetoCell(e){
  var pDate = new Date();
  var pSheet = SpreadsheetApp.getActiveSheet();
  var pRange = e.range; 
  
  switch(pRange.getColumn()){
    case 1:{
      if(pSheet.getRange(pRange.getRow(), 4).getValue().length <= 0){
        pSheet.getRange(pRange.getRow(), 4).setValue(pDate);
        if(pSheet.getRange(pRange.getRow(), 8).getValue() <= 0){
          pSheet.getRange(pRange.getRow(), 8).setValue(pSheet.getRange(pRange.getRow(), pRange.getColumn()).getValue());
        }
      }
      break;
    }
    case 2:{
      if(pSheet.getRange(pRange.getRow(), 5).getValue().length <= 0){
        pSheet.getRange(pRange.getRow(), 5).setValue(pDate);
        if(pSheet.getRange(pRange.getRow(), 9).getValue() <= 0){
          pSheet.getRange(pRange.getRow(), 9).setValue(pSheet.getRange(pRange.getRow(), pRange.getColumn()).getValue());
        }
      }
      break;
    }
    case 3:{
      if(pSheet.getRange(pRange.getRow(), 6).getValue().length <= 0){
        pSheet.getRange(pRange.getRow(), 6).setValue(pDate);
        if(pSheet.getRange(pRange.getRow(), 10).getValue() <= 0){
          pSheet.getRange(pRange.getRow(), 10).setValue(pSheet.getRange(pRange.getRow(), pRange.getColumn()).getValue());
        }
      }
      break;
    }
  }
}

标签: javascriptperformancegoogle-apps-scriptgoogle-sheets

解决方案


Google Apps 脚本非常快,但对SpreadsheetAppAPI 的调用非常慢。您应该通过将调用分配给一个变量来最小化对 API 的调用次数,尤其是在它们被多次调用的情况下。

我也认为代码没有优化。重复调用,不必要的 switch case 使用(因为有一个带有casevs的模式column)。

我将这些重复的调用分配给一个变量并使用它们。此外,我确实简化了开关盒以使其更简单。测试代码是否像以前一样工作并且更快。

代码:

function addDateTimetoCell(e){
  var pDate = new Date();
  var pSheet = SpreadsheetApp.getActiveSheet();
  var pRange = e.range; 
  var row = pRange.getRow();
  var column = pRange.getColumn();
  
  var rangeCol1 = pSheet.getRange(row, column + 3);
  if(rangeCol1.getValue().length <= 0){
    rangeCol1.setValue(pDate);
    var rangeCol2 = pSheet.getRange(row, column + 4);
    if(rangeCol2.getValue() <= 0){
      rangeCol2.setValue(rangeRC.getValue());
    }
  }
}

推荐阅读