复制相关信息后,我正在尝试从模板中删除不需要的图纸。为此,我正在查找带有检查清单的工作表名称。如果查询返回的值为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选择工作表然后删除它的地方?
答案 0 :(得分:0)
要从Sheet
中删除Spreadsheet
,有两种适用的Spreadsheet
类方法(与往常一样,JavaScript中的拼写和大小写很重要):
Spreadsheet#deleteSheet
,它需要一个Sheet
对象作为其参数Spreadsheet#deleteActiveSheet
,不带任何参数前者适用于任何类型的脚本和任何类型的触发器,而后者仅对通过基于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
)”
其他阅读: