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

时间:2015-06-04 06:20:52

标签: javascript google-apps-script google-sheets

我试图在电子表格上运行以下代码。名称列是第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);
}

1 个答案:

答案 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 ,因为它不存在。

希望这有帮助。