Javascript For语句将i视为字符串而不是数字

Javascript For语句将i视为字符串而不是数字,javascript,google-apps-script,Javascript,Google Apps Script,有人能告诉我为什么当我运行下面的代码时,它会将我的“Syncing”字符串放在第11行而不是第2行(如果它是标题后面的第一个选项)。基本上,当我写I+1时,它是“11”,而不是数字“2” 如果我这样写的话,它确实可以工作,但是我得到了一个效率灯泡,告诉我减少对getValue()的调用 for(var i=1;i现在您的代码连接字符串。因此var i被视为字符串,您必须: var col=parseInt(i,10)+1; userSheet.getRange(col,2).setValue(“

有人能告诉我为什么当我运行下面的代码时,它会将我的“Syncing”字符串放在第11行而不是第2行(如果它是标题后面的第一个选项)。基本上,当我写I+1时,它是“11”,而不是数字“2”

如果我这样写的话,它确实可以工作,但是我得到了一个效率灯泡,告诉我减少对getValue()的调用


for(var i=1;i现在您的代码连接字符串。因此
var i
被视为字符串,您必须:

var col=parseInt(i,10)+1;

userSheet.getRange(col,2).setValue(“Snycing”);


parseInt中的第二个参数(10)用于:
基数[-第二个参数]
可选。介于2和36之间的值,表示[第一个参数]中包含的数字的基数。如果未提供,则前缀为“0x”的字符串视为十六进制,前缀为“0”的字符串视为八进制。所有其他字符串均视为十进制


您也可以:
var i=0;
分配到循环外部。
或者使用
+
运算符将其转换为数字。因此:

var i;
 for (+i in usValues){..} //I believe this should work

您正在访问
usValues
作为带有
for…的对象,在
符号中。它实际上是一个数组,尽管是二维的

for…in
方法以字符串的形式返回对象键,对于数组,这些字符串是零开始索引值。这就是为什么以后要连接
+1

您是对的,第二个模型在循环中使用get值效率很低,但这是在数组中循环的更好方法。使用已经获取的2d数组:

var usValues = userSheet.get values(1,1,userSheet.getMaxRows(),2));
for (var i =0; i < usValues.length; i += 1){
  var curEmail = usValues[i][0];
  if (curEmail === myEmail){
   usValues[i][1] = "Syncing";
  }
}
userSheet
  .getRange(1,1,usValues.length,2)
  .set values(usValues)
var usValues=userSheet.get值(1,1,userSheet.getMaxRows(),2));
对于(变量i=0;i

使用一个查询进行获取,同样,使用一个调用进行设置。所有比较逻辑仅使用标准js数组值。快多了。

谢谢。我知道我需要将其更改为整数,但我不知道如何更改。这是一种针对不合适的数组循环方法的黑客攻击。它如何不合适,我应该以什么方式循环数组?@BjornBehrendt看一下Jonathon的答案。这将解决问题的根源。第二个答案提供了一个更好的解决方案(Jonathon)。实际上,您通过更改两个参数来混合两个问题:循环索引和电子表格服务调用。
var i;
 for (+i in usValues){..} //I believe this should work
var usValues = userSheet.get values(1,1,userSheet.getMaxRows(),2));
for (var i =0; i < usValues.length; i += 1){
  var curEmail = usValues[i][0];
  if (curEmail === myEmail){
   usValues[i][1] = "Syncing";
  }
}
userSheet
  .getRange(1,1,usValues.length,2)
  .set values(usValues)