#google-apps-script #google-sheets
#google-apps-script #google-sheets
Вопрос:
Я могу удалить все незащищенные строки данных с листа с помощью App Script. Название листа получено из пользовательского ввода другого листа с именем «Панель мониторинга». Но теперь мне нужно удалить все незащищенные строки данных со всех листов электронной таблицы, в названиях которых есть как алфавиты, так и цифры. Пожалуйста, обратите внимание, что у меня есть два типа имен листов, таких как CSE4115, ICT1234, MATH4101 и т.д. (как алфавиты, так и число), а также Master, Dashboard, TempDataSet и т.д. (только алфавиты в их названиях). Итак, мне нужно удалить все незащищенные строки данных из листов, таких как CSE4115, ICT1234, MATH4101 и так далее. Я думаю, пользовательский ввод не требуется.
Мои коды следующие:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Tasks')
.addItem('Data Cleansing', 'dataCleansing')
.addSeparator()
.addToUi();
}
function dataCleansing(){
var ss = SpreadsheetApp.getActive();
var allsheets = ss.getSheets();
for(var s in allsheets){
var sheet = allsheets[s];
if((sheet.indexOf("0")>-1 || sheet.indexOf("1")>-1 || sheet.indexOf("2")>-1 ||
sheet.indexOf("3")>-1 || sheet.indexOf("4")>-1 || sheet.indexOf("5")>-1 ||
sheet.indexOf("6")>-1 || sheet.indexOf("7")>-1 || sheet.indexOf("8")>-1 || sheet.indexOf("9")>-1)){
//For removing unprotected rows of data from a particular sheet
// 1. Retrieve data range.
const dataRange = sheet.getDataRange();
// 2. Create an object from the protected range. This is used for removing from the cleared rows.
const protectedRanges = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE).map(e => {
const r = e.getRange();
const start = r.getRow();
return {start: start, end: r.getNumRows() start - 1};
});
// 3. Create range list for clearing rows using the object.
let rangeList = [];
for (let r = 2; r <= dataRange.getNumRows(); r ) {
let bk = false;
for (let e = 0; e < protectedRanges.length; e ) {
if (protectedRanges[e].start == r) {
r = protectedRanges[e].end;
bk = true;
break;
}
}
if (!bk) rangeList.push(`A${r}:${r}`);
}
// 4. Delete the rows without the rows of the protected ranges.
if (rangeList.length > 0) sheet.getRangeList(rangeList).getRanges().reverse().forEach(r => sheet.deleteRow(r.getRow()));
}
}
}
Ответ №1:
Непроверено, но я думаю, вам следует изменить этот бит:
var allsheets = ss.getSheets();
Для:
const allsheets = ss.getSheets().filter(sh => /d/.test(sh.getName()));
который в основном гласит «получить все листы, которые содержат число (0-9) в их названии)» и позволяет вам избавиться от IF
проверки ниже:
if((sheet.indexOf("0")>-1 || sheet.indexOf("1")>-1 || sheet.indexOf("2")>-1 ||
sheet.indexOf("3")>-1 || sheet.indexOf("4")>-1 || sheet.indexOf("5")>-1 ||
sheet.indexOf("6")>-1 || sheet.indexOf("7")>-1 || sheet.indexOf("8")>-1 || sheet.indexOf("9")>-1))
Не связанные:
- Вы используете
for-in
цикл для повторенияallsheets
, но посколькуallsheets
должен быть массив, возможно, было бы лучше использоватьfor-of
. Другими словами:for (const sheet of allsheets) { ... }
A${r}:${r}
Допустимо или нужна ссылка на столбец после:
? Не уверен, просто указываю это на всякий случай.