删除在查找中找不到的工作表

时间:2018-10-02 18:33:57

标签: google-apps-script google-sheets

复制相关信息后,我正在尝试从模板中删除不需要的图纸。为此,我正在查找带有检查清单的工作表名称。如果查询返回的值为0.0,那么我想删除工作表。

function myFunction() {

var studentsheet = SpreadsheetApp.openById('1Qj9T002nF6SbJRq-iINL2NisU7Ld0kSrQUkPEa6l31Q').;

var sheetsCount = studentsheet.getNumSheets();
var sheets = studentsheet.getSheets();
for (var i = 0; i < sheetsCount; i++){
      var sheet = sheets[i]; 
      var sheetName = sheet.getName();

  Logger.log(sheetName);
var index = match(sheetName);

 Logger.log(index);
  if (index = "0.0"){
var ss = studentsheet.getSheetByName(sheetName).activate();
    ss.deleteactivesheet();
}
  else {}
}

function match(subject) {

 var sourcesheet = SpreadsheetApp.openById('14o3ZG9gQt9RL0iti5xJllifzNiLuNxWDwTRyo-x9STI').getSheetByName("Sheet6").activate();

  var lookupvalue = subject;
  var lookuprange = sourcesheet.getRange(2, 2, 14, 1).getValues().map(function(d){ return d[0] });

 var index = lookuprange.indexOf(subject)+1;
  return index;
}
};

问题最终在尝试删除工作表时结束。我已经修改了代码,因此它选择了工作表并将其激活,但是在下一行中,我不允许调用.deleteactivesheet()。有谁知道我该如何写这个末端部分,以便在我可以根据索引分数为0选择工作表然后删除它的地方?

1 个答案:

答案 0 :(得分:0)

要从Sheet中删除Spreadsheet,有两种适用的Spreadsheet类方法(与往常一样,JavaScript中的拼写和大小写很重要):

前者适用于任何类型的脚本和任何类型的触发器,而后者仅对通过基于UI的调用(编辑/更改触发器,菜单单击或其他手册)的绑定脚本有意义。执行),因为“激活”工作表是对Spreadsheet资源的无意义操作,该资源在带有附加的Apps Script实例的UI中未打开。

因此,最小的必要修改是:

var index = match(sheet);
if (index === 0) { // if Array#indexOf returned -1 (not found), `match` returned -1 + 1 --> 0
  studentsheet.deleteSheet(sheet);
}

更相关的修改如下:

function deleteNotFoundSheets() {
  const studentWb = SpreadsheetApp.openById("some id");
  const lookupSource = getLookupRange_(); // assumes the range to search doesn't depend on the sheets that may be deleted.

  studentWb.getSheets().filter(function (s) {
    return canDelete_(lookupSource, s.getName());
  }).forEach(function (sheetToDelete) {
    studentWb.deleteSheet(sheetToDelete);
  });
}

function getLookupRange_() {
  const source = SpreadsheetApp.openById("some other id");
  const sheet = source.getSheetByName("some existing sheet name");
  const r = sheet.getRange(...);
  return r.getValues().map(...);
}
function canDelete_(lookupRange, subject) {
  /** your code that returns true if the subject (the sheet name) should be deleted */
}

此修改使用可用的Array类方法来简化代码的逻辑(通过删除仅用于迭代的迭代器,而将包含的值公开给匿名回调函数)。基本上,这段代码很容易理解为“在所有工作表中,我们需要这些工作表(filter),并且我们希望对它们进行相同的操作(forEach)”

其他阅读: