我正在尝试在电子表格上运行以下代码。名称列是第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: Ok...我尝试了一些新代码,但仍然收到一个空白消息框,并且日志中没有任何内容。我不确定在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);
}发布于 2015-06-04 15:27:48
据我所知,你去帮助,而不是一个现成的解决方案,所以给你。
优先:
尽量避免使用全局变量。把你所有的变量放在你的函数里。否则,当您向电子表格添加更多函数时,您将遇到问题。你的代码应该是这样开始的:
function copyNames() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var listOfNames = new Array ();Second:
尝试减少对电子表格的服务调用数量。您的脚本需要几秒钟才能转到工作表并获取这些值。而不是每次都这样做,只取一次这些值并将它们推入一个变量中。
在您的例子中,您已经这样做了,但是没有使用该变量,而是继续使用服务调用。检查这一行:
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++)甚至不会运行,因为listOfNames.length和i都是0。这就是为什么你的记录器不会给出任何输出。你的脚本永远不会到那一行。
第四:
您没有名为ListOfEDs的变量,因此您的最后两行代码只给出了一个错误。您的脚本不知道什么是ListOfEDs,因为它不存在。
希望这能有所帮助。
https://stackoverflow.com/questions/30636360
复制相似问题