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

时间:2014-10-13 17:07:02

标签: javascript google-apps-script

有人可以告诉我为什么当我运行以下代码时,它会放置我的"同步"字符串进入第11行而不是第2行(如果它是标题后的第一个选项)。基本上当我写i + 1时,它正在制作" 11"而不是数字" 2";

  for (var i in usValues){
    var curEmail =   usValues[i][0];
    if (curEmail == myEmail){
     userSheet.getRange(i+1, 2).setValue("Snycing"); // going into column 11 instead of 2
    }
  } 

如果我用这种方式写它,它确实有效,但我得到效率灯泡告诉我减少对getValue()的调用。

  for (var i= 1; i<=userSheet.getMaxRows(); i++){
   var curEmail =   userSheet.getRange(i, 1).getValue();
    if (curEmail == myEmail){
     userSheet.getRange(i, 2).setValue("Snycing");
    }
  } 

2 个答案:

答案 0 :(得分:3)

您正在使用usValues表示法访问for...in作为对象。它实际上是一个阵列,尽管是2D。

for...in方法将对象键作为字符串返回,对于数组,它是零起始索引值。这就是为什么你以后连接+1的原因。

你是对的,第二个模型在循环中获取值时效率低,但它是循环数组的更好方法。使用已经获取的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)

获得一个查询,同样只需一次调用即可设置。所有比较逻辑只使用标准的js数组值。更快。

答案 1 :(得分:-1)

现在你的代码连接字符串。因此Var i被视为字符串,您必须:

var col = parseInt(i,10) + 1;
userSheet.getRange(col, 2).setValue("Snycing");


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


您还可以:
在您的循环之外分配var i = 0; 或者使用+运算符转换为数字。所以:

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