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 而不是公式
我正在尝试使用 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 而不是公式