【问题标题】:Google Sheets App Script While Loop won't stop iterating?Google Sheets App Script While Loop不会停止迭代?
【发布时间】:2022-01-14 12:35:47
【问题描述】:

我正在尝试使用 while 循环来定位行号,我认为这将是非常基本的操作,因为您可以迭代直到满足条件,我已经获得了我想要找到的值设置为一个变量,我认为 while 循环会遍历所有选项,直到达到我的条件,然后返回 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;
    
  }


【问题讨论】:

  • 为了正确复制您Trouble is, using the logger i'm able to see that it finds the result i'm after and then continues to iterate的情况,能否提供示例输入输出情况作为图片?
  • 抱歉,它的输入是一个日期(从星期一开始的星期),它试图在另一张纸上找到相同的日期,这样我就可以使用 i 的值作为行号来写入数据在另一个函数中
  • 感谢您的回复。从你的回复中,我提出了一个答案。你能确认一下吗?如果我误解了您的实际情况并没有用处,我深表歉意。

标签: javascript google-sheets while-loop iteration


【解决方案1】:

根据您的以下回复,

它的输入是一个日期(从星期一开始的星期),它试图在另一张纸上找到相同的日期,以便我可以使用 i 的值作为行号将数据写入另一个函数

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

模式一:

在此模式中,日期对象的单元格值被转换为 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;
}

模式2:

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

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;
}

注意:

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

参考资料:

【讨论】:

  • getTime() 出现错误是否正常?它说这不是一个有效的功能,我相信这是由于没有将其声明为日期?
  • 所以在玩弄了你的解决方案之后,getDisplayValue() 工作了,但是 getTime() 提供了一个错误“函数不可用”并且 findIndex() 也没有工作,因为 C 没有声明,感谢您帮助我找到解决方案!
  • @br4dl3y 感谢您的回复。我带来的不便表示歉意。当我询问示例输入和输出情况时,您说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。通过这个,我提出了一个修改后的脚本,因为你的值是日期对象。
  • @br4dl3y 但是从is it normal for the getTime() to present an error? It says it's not a valid function, i believe this is due to not declaring it as a date?So after playing around with your solutions, the getDisplayValue() worked, however getTime() provided an error "function not available" and the findIndex() didn't work either as C was not declared, thank you for helping me find a solution! 来看,认为你的值不是日期对象。
  • @br4dl3y 在这种情况下,我认为为了正确复制您的情况,需要检查您的示例电子表格。那么,您能否提供包含正确复制当前问题的当前脚本的示例电子表格?通过这个,我想修改脚本。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多