首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在列表中列出唯一项并将其复制到新工作表的代码问题

在列表中列出唯一项并将其复制到新工作表的代码问题
EN

Stack Overflow用户
提问于 2015-06-04 14:20:52
回答 1查看 42关注 0票数 0

我正在尝试在电子表格上运行以下代码。名称列是第4列。我尝试遍历该名称列表,将每个新的唯一名称推入一个数组(listOfNames),然后添加一个新工作表(NamesList),最后将该数组添加到新工作表的单元格A1中。当我运行下面的代码时,我得到的只是一个带有OK和Cancel按钮的空白弹出窗口。当我查看日志时,它也是空白的。我是个新手,我觉得我漏掉了一些明显的东西...只是不确定是什么。我是不是误解了某些特定于GAS而不是JS的东西?

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2015-06-04 15:27:48

据我所知,你去帮助,而不是一个现成的解决方案,所以给你。

优先:

尽量避免使用全局变量。把你所有的变量放在你的函数里。否则,当您向电子表格添加更多函数时,您将遇到问题。你的代码应该是这样开始的:

代码语言:javascript
运行
复制
function copyNames() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var listOfNames = new Array ();

Second:

尝试减少对电子表格的服务调用数量。您的脚本需要几秒钟才能转到工作表并获取这些值。而不是每次都这样做,只取一次这些值并将它们推入一个变量中。

在您的例子中,您已经这样做了,但是没有使用该变量,而是继续使用服务调用。检查这一行:

代码语言:javascript
运行
复制
var data = sheet.getDataRange().getValues();

现在,该工作表上的所有数据都在一个名为 data 的变量中。

代码语言:javascript
运行
复制
sheet.getDataRange(i,4).getValue();

等同于

代码语言:javascript
运行
复制
data[i][4];

唯一的区别是,在第一种情况下,大约需要2秒才能获得该值,而在第二种情况下,只需要几毫秒。

情况也是如此。

代码语言:javascript
运行
复制
sheet.getLastRow();

要么调用它一次,然后将其推入一个变量并使用它,要么在您的示例中使用

代码语言:javascript
运行
复制
data.length;

第三:

listOfNames是一个空数组,所以它的长度是0。这一行

代码语言:javascript
运行
复制
for (i=0; i<=listOfNames.length; i++)

甚至不会运行,因为listOfNames.lengthi都是0。这就是为什么你的记录器不会给出任何输出。你的脚本永远不会到那一行。

第四:

您没有名为ListOfEDs的变量,因此您的最后两行代码只给出了一个错误。您的脚本不知道什么是ListOfEDs,因为它不存在。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30636360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档