Мой процесс удаления строк работает нормально для одного листа. Как это можно сделать для всех листов электронной таблицы с определенными именами?

#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} Допустимо или нужна ссылка на столбец после : ? Не уверен, просто указываю это на всякий случай.