Google Sheets App Script While Loop 不会停止迭代?

Google Sheets App Script While Loop won't stop iterating?

我正在尝试使用 while 循环查找行号,我认为这将是非常基本的操作,因为您可以迭代直到满足条件,我已经找到了我要查找的值设置为变量,我认为 while 循环会遍历所有选项,直到达到我的标准,然后 return i 的值(在本例中代表行号) 问题是,使用记录器我可以看到它找到了我想要的结果然后继续迭代,有人能帮忙吗? 将不胜感激,谢谢!

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Summary');
  var sheet2 = ss.getSheetByName('Labour');
  var i = 3;
  var values = sheet2.getRange(i,3).getValue();
  ///Logger.log(values);
  var value = sheet.getRange(2,11).getValue();
  ///Logger.log(value);
  while(values != value){
   /// Logger.log(i);
   /// Logger.log(values);
    i = i +1;
    values = sheet2.getRange(i,3).getValue();
    }
  return i;
    
  }


根据您的以下回复,

it's input is a date (week commencing mondays date) and it's trying to find the same date on another sheet, so that i can use the value of i as the row number to write data to in another function

我认为在您的情况下,单元格值可能是日期对象。我认为当单元格值是日期对象时,您的问题可能会发生。我认为这可能是您遇到问题的原因。因此,对于带有 Google Apps 脚本的电子表格,我认为以下两种模式可用于比较日期对象的单元格值。

模式 1:

在此模式中,日期对象的单元格值被转换为 unix 时间并进行比较。

function sample1() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Summary');
  var sheet2 = ss.getSheetByName('Labour');
  var i = 3;
  var values = sheet2.getRange(i, 3).getValue().getTime();
  var value = sheet.getRange(2, 11).getValue().getTime();
  while (values != value) {
    i = i + 1;
    values = sheet2.getRange(i, 3).getValue().getTime();
  }
  return i;
}

模式二:

在此模式中,日期对象的单元格值被转换为字符串值作为显示值。

function sample2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Summary');
  var sheet2 = ss.getSheetByName('Labour');
  var i = 3;
  var values = sheet2.getRange(i, 3).getDisplayValue();
  var value = sheet.getRange(2, 11).getDisplayValue();
  while (values != value) {
    i = i + 1;
    values = sheet2.getRange(i, 3).getDisplayValue();
  }
  return i;
}

模式 3:

在您的脚本中,getValue 用于循环。在这种情况下,工艺成本变高。所以我认为你的脚本可以修改如下。

function sample3() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Summary');
  var sheet2 = ss.getSheetByName('Labour');
  var value = sheet.getRange(2, 11).getValue().getTime();
  var values = sheet2.getRange(3, 3, sheet2.getLastRow() - 2).getValues();
  var i = values.findIndex(([c]) => c.getTime() == value) + 3;
  return i;
}

function sample4() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Summary');
  var sheet2 = ss.getSheetByName('Labour');
  var value = sheet.getRange(2, 11).getDisplayValue();
  var values = sheet2.getRange(3, 3, sheet2.getLastRow() - 2).getDisplayValues();
  var i = values.findIndex(([c]) => c == value) + 3;
  return i;
}

注:

  • 根据您的回复,我认为您的单元格值可能是日期对象。至此,我提出了上述修改。因此,当您的实际电子表格不是日期对象时,可能需要修改脚本。当您测试上述脚本时,结果不是您期望的结果,您能提供示例电子表格吗?借此,我想确认一下。

参考文献:

解决方案是在 .getRange 之后添加 .getDisplayValues() 以将 time/date 读取为 time/date 而不是公式