как запустить скрипт пункта меню на выбранных вкладках листа - PullRequest
0 голосов
/ 23 января 2019

Я пытался выполнить этот скрипт границы только на определенных вкладках листа, и мне не удалось вызвать его через них. вкладки листа следующие. Текущие продажи, Отложенные заказы, Субподрядные заказы, Частичная отгрузка, Котировки, Архивные продажи.

function setborders() {
 var menu = [{name: "Borders for nonempty cells", functionName: "borders"}];
 SpreadsheetApp.getActiveSpreadsheet().addMenu("Set Borders", menu);
}

function borders() {
  var ss = SpreadsheetApp.getActive();
  var numsheets = ss.getNumSheets();
  var allsheets = ss.getSheets();
  for (var s in allsheets){
    var sheet=allsheets[s]
    var range = sheet.getRange("A2:V1000");
    var values = range.getValues();
    var offsetRow = range.getRowIndex();
    
    for(var i = 0; i < allsheets.length; i++) 
   if(['Current Sales','Pending Orders','Subcontract Orders','Partial Shipped','Quotes','Archived Sales'].indexOf(allsheets[i].getName())){
  
  if(sheet.getRange(range.getRow(), 1).getValue()) {
    range.setBorder(false, false, false, false, false, false);
    SpreadsheetApp.flush();
    for (var i = 0; i < values.length; i++) {
      if (values[i][0]) { // Only for non-empty A column cells
        sheet.getRange("A" + (i + offsetRow) + ":V" + (i + offsetRow)).setBorder(true, true, true, true, false, false, "black",SpreadsheetApp.BorderStyle.SOLID);
      }
    }
       
    for (i = 0; i < values.length; i++) {
      if (values[i][0] && values[i][14]) { 
        sheet.getRange("O" + (i + offsetRow) + ":O" + (i + offsetRow)).setBorder(true, true, true, true, true, true, "black",SpreadsheetApp.BorderStyle.SOLID_THICK);
      }
    }
    
    for (i = 0; i < values.length; i++) {
      if (values[i][0] && values[i][18]) { 
        sheet.getRange("S" + (i + offsetRow) + ":S" + (i + offsetRow)).setBorder(true, true, true, true, true, true, "black",SpreadsheetApp.BorderStyle.SOLID_THICK);
      }
    }
    for (i = 0; i < values.length; i++) {
      if (values[i][0] && values[i][19]) { 
        sheet.getRange("T" + (i + offsetRow) + ":T" + (i + offsetRow)).setBorder(true, true, true, true, true, true, "black",SpreadsheetApp.BorderStyle.SOLID_THICK);
      }
    }
    for (i = 0; i < values.length; i++) {
      if (values[i][0] && values[i][20]) { 
        sheet.getRange("U" + (i + offsetRow) + ":U" + (i + offsetRow)).setBorder(true, true, true, true, true, true, "black",SpreadsheetApp.BorderStyle.SOLID_THICK);
      }
    }
    for (i = 0; i < values.length; i++) {
      if (values[i][0] && values[i][21]) { 
        sheet.getRange("V" + (i + offsetRow) + ":V" + (i + offsetRow)).setBorder(true, true, true, true, true, true, "black",SpreadsheetApp.BorderStyle.SOLID_THICK);
      }
    }
  }
}
}
}

1 Ответ

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

Редакция 5

«Исправление» не сработало, потому что код вложил for s, причем оба повторяются по всем листам.Внутренний for имеет предложенное условие, а внешний - нет.

Редакция 1

Чтобы ограничить выполнение определенных частей кода определенной таблицей, вы можете использовать getName() метод Class Sheet и сравните его со списком действительных листов.Один из способов сделать это - создать массив допустимых имен листов, которые можно использовать indexOf.

Допустим, допустимыми именами листов являются Sheet1 и Sheet3, а sheets является коллекцией всех листов.в результате чего-то вроде var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();) следующий код будет перебирать все листы, но выполнять только одну часть кода на допустимых листах:

for(var i = 0; i < sheets.length; i++) 
   if(['Sheet1','Sheet3'].indexOf(sheets[i].getName())){
     //Add here the code to be executed on the valid sheets
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...