有人可以告诉我为什么当我运行以下代码时,它会放置我的"同步"字符串进入第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");
}
}
答案 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