用于使标签/工作表名称无法在Google电子表格中使用的脚本

时间:2017-06-17 12:00:39

标签: javascript google-apps-script

我有以下谷歌电子表格绑定脚本,其工作是在第一张工作表('项目')的A:A列中有数据时创建“模板”表的副本。

这个脚本工作得很好。但是,后来我在这个脚本中添加了一行代码(下面脚本中的代码的最后一行),用于提取并将新创建的工作表名称放在其中一个单元格J2中。

不知何故,当其余代码正常工作时,这行代码无效。对此有任何建议将不胜感激。谢谢!

function onOpen() {
  var menu = [{
        name : "Add",
        functionName : "newSheet"
    }];
SpreadsheetApp.getActiveSpreadsheet().addMenu("Sheet", menu);
}

function newSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var templateSheet = ss.getSheetByName("Template");
  var sheet1 = ss.getSheetByName("Projects")
  var getNames = sheet1.getRange("A:A").getValues().filter(String).toString().split(",");

for (var i = 0; i < getNames.length; i++) {
    var copy = ss.getSheetByName(getNames[i]);
    if (copy) {
        Logger.log("Sheet already exists");
    } else {
        templateSheet.copyTo(ss).setName(getNames[i]);
        ss.setActiveSheet(ss.getSheetByName(getNames[i]));
        ss.moveActiveSheet(ss.getNumSheets());

  ss.getSheetByName(getNames[i]).copyTo(ss.getSheetByName(getNames[i]).getRange("J2"));
    }
  }
}

1 个答案:

答案 0 :(得分:1)

根据GAS文档,Sheet类的copyTo()方法仅接受Spreadsheet实例作为参数。它不起作用,因为您将Range作为参数传递。此外,getSheetByName()返回Sheet对象,因此您实际上并未复制工作表的名称。

如果您想修改特定范围,则使用Range会更方便。

var sheet = ss.getSheetByName(getNames[i]);
var cell = sheet.getRange("J2");
cell.setValue(getNames[i]); // writing the name of the sheet to cell J2