我试图在电子表格上运行以下代码。名称列是第4列。我尝试运行该名称列表,将每个新的唯一名称推送到一个数组(listOfNames),然后添加一个新的工作表(NamesList),最后将该数组添加到新工作表的单元格A1中。当我运行下面的代码时,我得到的是一个带有OK和Cancel按钮的空白弹出窗口。当我查看日志时,它也是空白的。我对此非常陌生,我觉得我错过了一些明显的东西......只是不确定它是什么。我是否误解了GAS特有的东西而不是JS?
var sheet = SpreadsheetApp.getActiveSheet();
var listOfNames = new Array ();
function copyNames() {
var data = sheet.getDataRange().getValues();
for (i=0; i<=sheet.getLastRow(); i++){
var tempName = sheet.getDataRange(i,4).getValue();
for (i=0; i<=listOfNames.length; i++){
if (tempName != listOfNames[i]){
listOfNames.push(tempName);
logger.log(listOfNames);
}
}
}
sheet.insertSheet(ListOfEDs);
sheet.getRange('a1').setValue(listOfEDs);
}
编辑:我开始看到这会将值多次推送到列表中...所以也许它只是一起回到绘图板。我找到了其他代码,可以创建一个独特元素列表,但是不能确定代码是如何工作的。我以为我会自己弄清楚,所以我至少要理解它。
编辑2:好的......我尝试了一些新的代码,但我仍然得到一个空白的消息框,日志上没有任何内容。我不确定我是否是for循环中的for循环的迭代器是一件坏事,所以我把它切换到j。另外,我知道remove duplicates示例,并且一直在关注,但我不确定为什么需要使用join。
function copyNames() {
var sheet = SpreadsheetApp.getActiveSheet();
var listOfNames = new Array ();
var data = sheet.getDataRange().getValues();
for (i=2; i<=data.length; i++){ //starting at 2 because first row is a header
var tempName = data[i][4];
for (j=0; j<=listOfNames.length+1; j++){
if (tempName != listOfNames[j]){
listOfNames.push(tempName);
logger.log(listOfNames);
}
}
}
sheet.insertSheet("ListOfNames");
sheet.getRange('a1').setValue(listOfNames);
}
答案 0 :(得分:1)
据我所知,你去帮助而不是现成的解决方案,所以你走了。
首先:
尽量避免使用全局变量。将所有变量保留在函数中。否则,当您向电子表格添加更多功能时,您将遇到问题。您的代码应该像这样开始:
function copyNames() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var listOfNames = new Array ();
第二名:
尝试减少对电子表格的服务调用量。您的脚本需要几秒钟才能转到工作表并获取值。而不是每次都这样做,取一次这些值并将它们推入变量。
在您的情况下,您已经这样做了,但是没有使用该变量并继续使用服务调用。检查这一行:
var data = sheet.getDataRange().getValues();
现在该表上的所有数据都在一个名为 data 的变量中。
sheet.getDataRange(i,4).getValue();
与
相同data[i][4];
唯一的区别是,在第一种情况下,获取该值大约需要2秒,而在第二种情况下只需要几毫秒。
同样适用于
sheet.getLastRow();
调用一次并将其推入变量并使用它,或者在您的情况下使用
data.length;
<强>第三强>
listOfNames 是一个空数组,因此它的长度为0。 这一行
for (i=0; i<=listOfNames.length; i++)
甚至不会运行,因为 i 和 listOfNames.length 都是0。 这就是为什么您的记录器不提供任何输出。你的脚本永远不会到达那条线。
<强>第四:强>
您没有名为 ListOfEDs 的变量,因此您的最后两行代码只会出错。您的脚本不知道什么是 ListOfEDs ,因为它不存在。
希望这有帮助。