Google App Script - удалите вкладку, если имя вкладки не существует в другом массиве - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь извлечь имена всех существующих вкладок и сравнить их с другим массивом, который в данном случае является KANew.

Ниже приведен код, который я использовал ...

 function Checking() {

  var reportId = xxx
  var profileId = yyy;

  var httpOptions = {'headers': {'Authorization': 'Bearer ' + 
ScriptApp.getOAuthToken()}};       
  var additionalParameters = {'synchronous': 'true'};

  //run report and get file ID
  var ReportFile = eXelate.Reports.run(profileId, reportId, 
additionalParameters);
  var ReportFileID = (ReportFile.id);

  //
  var newReportFile = eXelate.Files.get(reportId, 
ReportFileID);
  if(newReportFile.urls) {var httpOptions = {'headers': {'Authorization': 
'Bearer ' + ScriptApp.getOAuthToken()}};
  var csvContent = UrlFetchApp.fetch(newReportFile.urls.apiUrl, 
httpOptions).getContentText();
  var csvData = Utilities.parseCsv(csvContent);

  //past data into sheet                        
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  sheet.insertRowsAfter(sheet.getMaxRows(), 6000);
  sheet.deleteRows(1,6000);
  sheet.getRange(1, 1, csvData.length, 
csvData[0].length).setValues(csvData);

  //delete beginning and report totals
  sheet.deleteRows(1, 11);
  var sheets = new Array()
  var activess = SpreadsheetApp.getActive();
  var sheetss = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  for (var i = 0; i < sheetss.length ; i++) sheets.push( [sheetss[i].getName() ] )
  var lastrow = sheet.getLastRow();
      sheet.deleteRows(lastrow);
  var rows = sheet.getDataRange();                        
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var rowsDeleted = 0;
  var rawvalues = sheet.getRange(2,1,lastrow,1).getValues();
  var rawvaluestring = rawvalues.toString();
  var sheetsforremoval = sheets.toString();
  var lR = sheet.getDataRange().getNumRows();
  var kA = sheet.getRange(2,1,lR,1).getValues();
  var kANew = [].concat.apply([],kA);
   for (var i = 0; i < kANew.length; i ++){
  kANew[i] += ' Placements'
  // Make sure to push the actual raw data name and keep it in the array 
  //so that the deleteSheet doesn`t recognize raw data name as something to delete!!!!!!!!!
   }
  kANew.push('Sheet1')

      for (var i = 0; i <= numRows - 1; i++) {
    var row = values[i];
    if (row[2] == 0 || row[2] == '') {
      sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
      rowsDeleted++; 
    }
    }

                         }

  var obj = {};
  var ret_arr = [];
  for (var i = 0; i < kANew.length; i++) {
    obj[kANew[i]] = true;
  }
  for (var key in obj) {
    ret_arr.push(key);
  }
  Logger.log(ret_arr)
  for (var i = 0; i < ret_arr.length; i ++) {
    if (ret_arr.indexOf(sheetss[i]) == -1) { // what is wrong with this getName function?
    activess.deleteSheet(sheetss[i])
    }
  }
}

Когда я запускаю этот код, он удаляет все вкладки, существующие в текущем листе Google. Предполагается удалить вкладки, если фактическое имя вкладки отсутствует в этом массиве ret_arr.

Таким образом, в основном логика заключается в следующем: а) сравнить листы [i] с ret_arr б) Если элементы в листах [i] не найдены в массиве ret_arr, удалите эту вкладку соответствующим образом.

  • Примечание: когда я пытаюсь сделать это с помощью функции ".getName ()", возвращается сообщение о невозможности получить .getName () с неопределенным значением.

Пример ниже ...

  for (var i = 0; i < ret_arr.length; i ++) {
    if (ret_arr.indexOf(sheetss[i].getName()) == -1) { // what is wrong with this getName function?
    activess.deleteSheet(sheetss[i])
    }
  }
}

Может кто-нибудь предложить мне, где мне следует исправить, чтобы он мог удалить только соответствующие вкладки?

1 Ответ

0 голосов
/ 23 апреля 2019

попробуйте это:

function deleteListedSheets() {
  var ss=SpreadsheetApp.getActive();
  var shts=ss.getSheets();
  var removeTheseSheets=['Sheet5','Sheet6','Sheet7','Sheet8'];
  var sheetsToDelete=shts.filter(function(sh){
    var name=sh.getName();
    return removeTheseSheets.indexOf(name)!=-1;
  });
  sheetsToDelete.forEach(function(sh){ss.deleteSheet(sh)});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...