Макрос Google Sheets для удаления столбцов в определенных вкладках на основе заголовка - PullRequest
0 голосов
/ 02 октября 2019

Я написал макрос, который создает вкладки листа и заполняет их на основе определенных критериев. Например, если я хочу выделить строки, обозначающие «Закрыт выигран», и переместить их на новую вкладку. Я запусту эту функцию на моей главной вкладке под названием «data» и создам новую вкладку под названием «Closed Won».

Эта новая вкладка будет дублировать тот же заголовок, что и в «data», а затем заполнитсявсе строки с «Закрыт выиграл» в столбце L.

Тем не менее, эта новая вкладка содержит больше данных, чем мне нужно. Я хочу удалить определенные столбцы, ЕСЛИ у них есть имя столбца И имя вкладки (поэтому он не удаляет столбцы в моей исходной вкладке данных).

У меня проблемы с IF. Может кто-нибудь помочь с простым скриптом, который я могу добавить в конец оригинальной функции?

function closed_won() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('1:1').activate();
  spreadsheet.insertSheet(1);
  spreadsheet.getRange('1:1').activate();
  spreadsheet.getActiveSheet().setName('closed_won');
  spreadsheet.getRange('data!1:1').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('data');
  var testrange = sheet.getRange('L:L');
  var testvalue = (testrange.getValues());
  var csh = ss.getSheetByName('closed_won');
  var data = [];
  var j =[];
    for (i=0; i<testvalue.length;i++) {
      if ( testvalue[i] == 'Closed Won') {
  data.push.apply(data,sheet.getRange(i+1,1,1,25).getValues());
  j.push(i);
 }
 }
csh.getRange(csh.getLastRow()+1,1,data.length,data[0].length).setValues(data);
// THIS IS WHERE I WANT TO ADD THE DELETE COLUMN CODE
}

1 Ответ

0 голосов
/ 02 октября 2019

Вы хотите удалить столбцы, в которых имя заголовка соответствует имени листа - хотя, очевидно, не на текущем листе.

Процесс таков:

  1. получить листы и их имена;сохранить их в массиве
  2. получить строку заголовка. Это будет двумерный массив, поэтому «сведите» его к 1D, чтобы упростить сопоставление
  3. в цикле по заголовкам и искать совпадения с именами листов. Код использует indexOf для этого.

    3.1 при обнаружении совпадения имени заголовка и имени столбца убедитесь, что оно не соответствует текущему листу
    3.2. создать массив номеров столбцов для удаления.

  4. После цикла измените порядок массива в обратном порядке, чтобы сначала были указаны «самые высокие» номера столбцов, подлежащих удалению.
  5. Цикл по удаляемому элементуномера столбцов и удалите столбцы

function SO5819343001() {

  var spreadsheet = SpreadsheetApp.getActive();

  // get sheets names
  var thesheets = [];
  var sheets = spreadsheet.getSheets();
  if (sheets.length > 1) {
    for (var i=0; i<sheets.length;i++){
      thesheets.push(sheets[i].getName());
    }
  }


  // move to 'closed_won'
  var csh = spreadsheet.getSheetByName('closed_won');


  // get the headers
  //last column for range
  var cshLC = csh.getLastColumn();
  var headers = csh.getRange(1,1,1,cshLC).getValues();

  // flatten headers from 2D to 1D
  var flatheaders = headers.reduce(function(a, b){return a.concat(b);});  
  // Logger.log(flatheaders); DEBUG

  // create variables for loop
  var cshname = csh.getName();
  var deletions = [];

  // loop through the headers and compare to sheet names
  for (var h = 0; h<cshLC;h++){

    var idx = thesheets.indexOf(flatheaders[h]);
    // Logger.log("DEBUG: h = "+h+", header = "+flatheaders[h]+", match = "+idx)

    // is this a match?
    if (idx !=-1){
      // found a match for column name and sheet name

      // make sure it is not this sheet
      if (flatheaders[h] != cshname){

        // Logger.log("DEBUG: the match is NOT on this sheet. Proceeding")
        // create an array of the column numbers to be deleted
        deletions.push(h+1);
      }
      else{
      Logger.log("the match IS on this sheet. Abort.")
      }

    }

  }
  // Logger.log(deletions); DEBUG
  // reverse the column order
  var rev_deletions = deletions.reverse();
  // Logger.log(rev_deletions); // DEBUG

  // loop through the 'to-be-deleted' columns and delete them
  for (d = 0;d<deletions.length;d++){
    csh.deleteColumn(rev_deletions[d]);
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...