Запуск сценария на определенных листах в электронной таблице - PullRequest
0 голосов
/ 25 января 2019

ПРИМЕЧАНИЕ. Далее следует , как запустить скрипт пункта меню на выбранных вкладках листа

Я пытаюсь запустить этот скрипт только на указанных листах, чтобы нарисовать границы, как установлено в коде. Может ли кто-нибудь помочь в исправлении кода. Я нашел отличную информацию об этом сообщении Ссылка на переполнение стека У меня сейчас проблемы со строкой 11, TypeError: Невозможно вызвать метод "getRange" из null. Если я смогу закрепить часть границ сценария, я не уверен, как это сделать. ссылка на лист теста

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

function borders() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  for (i = 0; i < 6; i++) {
    var sheet = ss.getSheetByName(sheets[i]);
    var range = sheet.getRange("A2:V1000");
    var values = range.getValues();
    var offsetRow = range.getRowIndex();
    
              
    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);
      }
    }
  }
}

Ответы [ 3 ]

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

В коде есть несколько недостатков, из-за которых вам сложно применить ответ на свой предыдущий вопрос

  1. Отступ не применяется должным образом
  2. Несколько for (i = 0; i < values.length; i++)
  3. Наличие цикла for для перебора всех листов внутри другого цикла for, который также перебирает все листы.

Предложения

  1. Очистите ваш код

    1. Правильно применить отступ
    2. Переместить все

      if (values[i][0] && values[i][/*a number */]) { 
        // Call to setBorder
      }
      

      в один

      for (i = 0; i < values.length; i++) {...}
      
  2. Удалить for(var i = 0; i < allsheets.length; i++)

  3. Добавить if(!['Current Sales','Pending Orders','Subcontract Orders','Partial Shipped','Quotes','Archived Sales'].indexOf(sheets.getName())) return; чуть ниже var sheet=allsheets[s]
0 голосов
/ 31 января 2019

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

function borders() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet_name = ['Current Sales','Pending Orders', 'Subcontract Orders', 'Partial Shipped', 'Quotes', 'Archived Sales']; 
  for (s=0; s<sheet_name.length; s++) {
    var sheet = ss.getSheetByName(sheet_name[s]);
    var range = sheet.getRange("A2:V1000");
    var values = range.getValues();
    var offsetRow = range.getRowIndex();
    
              
    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);
      }
    }
  }
}

Это решило это!

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

Не уверен, есть ли лучший способ сделать это, но вот одно решение:

var menu = [{name: "Borders for nonempty cells", functionName: "borders"}];
var sheetName = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();

if(sheetName === 'Name of sheet') {
  SpreadsheetApp.getActiveSpreadsheet().addMenu("Set Borders", menu);
}
else {
 SpreadsheetApp.getActiveSpreadsheet().removeMenu("Set Borders");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...