Google apps script 在两个单元格中循环查找匹配项,然后在出现';这是一场比赛

Google apps script 在两个单元格中循环查找匹配项,然后在出现';这是一场比赛,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在尝试编写一个google应用程序sctipt,它循环到日期范围以查找匹配项,并且对于找到的每个匹配项,它都会将指定范围的“费用”复制到指定范围。当我运行脚本时,它会执行,但什么也没发生。它超过了执行时间限制,所以我认为它陷入了一个循环 更新:我已经创建了一个测试工作表,如果有人想查看相关数据的示例: 这是我的密码: function menuItem1() { var sheet = SpreadsheetApp.getActiveSheet(); //Updating Expen

我正在尝试编写一个google应用程序sctipt,它循环到日期范围以查找匹配项,并且对于找到的每个匹配项,它都会将指定范围的“费用”复制到指定范围。当我运行脚本时,它会执行,但什么也没发生。它超过了执行时间限制,所以我认为它陷入了一个循环

更新:我已经创建了一个测试工作表,如果有人想查看相关数据的示例:

这是我的密码:

function menuItem1() {
 var sheet = SpreadsheetApp.getActiveSheet();

  //Updating Expenses 2
  for(row = 10; row <= 61; row++){
    var date1 = sheet.getRange(row, 3, 1);
    var date1value = date1.getValue();

    for(row2 = 22; row2 < 59; row++){
      var date2 = sheet.getRange(row2, 18, 1);
      var date2value = date2.getValue();


      if(date1value == date2value){
        sheet.getRange(row2, 19, 2, 8).copyTo(sheet.getRange(row1, 5, 8), {contentsOnly:true});
      }
    }
函数menuItem1(){
var sheet=SpreadsheetApp.getActiveSheet();
//更新费用2

对于(row=10;row),您应该阅读有关的文档,以尝试加快代码的速度

下面是你的代码的严格翻译,当你做完全相同的事情时,它将在不到一秒钟内执行。一旦你摆脱超时问题,我希望你能让它做你想做的事情

当然,我没有测试脚本的最终目标,因为我不知道您的数据

有几个变量是日期,在这种情况下,您应该特别注意它,看看日期是否最终有一个在工作表中看不到的相关时间值,并处理它

代码:

function menuItem1() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();// get all values in your sheet up to the last row and last column (where data exist)
  // define limits in array (values = row values-1)
  var r1start = 9;
  var r1max = 60;
  var r2start = 21;
  var r2max = 58;
  // choose columns
  var col1 = 2; 
  var col2 = 17;
  for(var r1=r1start ;  r1<r1max ; r1++){
    for(var r2=r2start ;  r2<r2max ; r2++){
      if(data[r1][col1] == data[r2][col2]){
        sheet.getRange(r2+1, 19, 2, 8).copyTo(sheet.getRange(r1+1, 5, 8), {contentsOnly:true});
        Logger.log('match found');
      }
    }
  }
}
函数menuItem1(){
var sheet=SpreadsheetApp.getActiveSheet();
var data=sheet.getDataRange().getValues();//获取工作表中直到最后一行和最后一列(数据存在的位置)的所有值
//在数组中定义限制(值=行值-1)
var r1=9;
var r1最大值=60;
var r2start=21;
var r2max=58;
//选择列
var col1=2;
var-col2=17;

对于(var r1=r1start;r1非常感谢您让我了解最佳实践。我肯定会仔细阅读。但是对于您提供的代码,它肯定解决了超出执行时间限制的问题,但它没有成功地复制数据,我不确定为什么……如果您想查看数据,我已经创建了一个测试工作表。添加了上面的链接。正如您将看到的,有相应的日期,但匹配的日期不会导致工作表右侧的数据被复制到相应的左侧日期。感谢工作表副本…现在容易多了;-)顺便说一句,当您提供共享工作表的链接时,您应该在“仅查看”中共享它(并强迫人们做一份副本来测试)以避免一些用户在你的工作表中塞满各种垃圾;-)(我从经验中学到了!!,即使在这里,你也不能信任人;-)我允许自己更改共享属性…希望你不会介意;-)非常感谢Serge(并注意到未来的共享,哈哈).这很有效!你真厉害!
function menuItem1() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();// get all values in your sheet up to the last row and last column (where data exist)

  // define limits in array (values = row values-1)
  var r1start = 9;
  var r1max = 60;
  var r2start = 21;
  var r2max = 58;

  // choose columns
  var col1 = 2; 
  var col2 = 17;

  for(var r1=r1start ;  r1<r1max ; r1++){
    for(var r2=r2start ;  r2<r2max ; r2++){
      if(data[r1][col1]=='' || data[r2][col2]==''){continue}; // skip all empty rows to avoid false equalities in empty cells and speed up the process
      Logger.log(data[r1][col1]+'  = ?  '+data[r2][col2]);// this is only to view data in the logger
      if(data[r1][col1].getTime() == data[r2][col2].getTime() ){ // compare on date native values
        sheet.getRange(r2+1, 19, 2, 8).copyTo(sheet.getRange(r1+1, 5, 8), {contentsOnly:true});
        Logger.log('match found'); 
      }
    }
  }
}