Как заставить скрипт приложения l oop через диапазон, в котором количество значений может изменяться - PullRequest
0 голосов
/ 16 марта 2020

У меня есть довольно базовый c лист, настроенный для создания ежемесячных форм проверки для оперативников за несколько рабочих смен, путем считывания данных о производительности из центрального файла в предварительно отформатированный документ в зависимости от смены и имени, выбранного в раскрывающихся списках.

Мое намерение состоит в том, чтобы после того, как я выбрал смену, мой сценарий выполняет итерацию по раскрывающимся именам операторов и выплевывает заполненный контрольный лист по операциям.

Я в большинстве случаев лучше так как я смог объединиться с помощью приведенного ниже сценария, который проходит через рабочие имена, копируя / вставляя только значения целого листа во временный лист для вырезания формул, а затем копируя этот временный лист во вновь созданный ежемесячный файл и переименование дублированного листа в оперативное имя.

Единственная проблема, с которой я сталкиваюсь, заключается в том, что именованный диапазон для оперативных имен установлен как Диапазоны! B2: B151 в базе файл, однако фактический список имен может быть только первым 20-30 ячеек, в зависимости от количества оперативников на выбранную смену. Поэтому сценарий завершается ошибкой, когда он попадает в первое пустое значение в конце списка имен.

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

function loopExport() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Report');
  var month = sheet.getRange('N6:Q6').getValue();
  var shift = sheet.getRange('B6:C6').getDisplayValue();
  var data = ss.getSheetByName('Ranges').getRange('Names').getValues();
  var ssnewname = "Operative Reviews - "+shift+" - "+month;
  var ssnew = SpreadsheetApp.create(ssnewname);
  var tempsheet = ss.getSheetByName('TempCopy');

  // Get dropdown values from named range Names
  for (var i = 0; i < data.length; i++) {
    // Assign dropdown values in Report
    sheet.getRange('E6:G6').setValue(data[i][0]);
    // For each name, copy & paste values-only into temp sheet
    sheet.getRange('A1:Q52').copyTo(tempsheet.getRange("A1"),{contentsOnly:true});
    var opname = tempsheet.getRange('E6:G6').getValue();
    // For each name, copy temp sheet to new workbook ssnew and set name to operative name
    tempsheet.copyTo(ssnew).setName(opname);
  }
}

1 Ответ

0 голосов
/ 16 марта 2020

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

function loopExport() {
  var ss=SpreadsheetApp.getActive();
  var sheet=ss.getSheetByName('Report');
  var month=sheet.getRange('N6:Q6').getValue();
  var shift=sheet.getRange('B6:C6').getDisplayValue();
  var data=ss.getRangeByName('Names').getValues();
  var ssnewname="Operative Reviews - "+shift+" - "+month;
  var ssnew=SpreadsheetApp.create(ssnewname);
  var tempsheet=ss.getSheetByName('TempCopy');
  for (var i=0; i < data.length; i++) {
    if(data[i][0]) {
      sheet.getRange('E6:G6').setValue(data[i][0]);
      sheet.getRange('A1:Q52').copyTo(tempsheet.getRange("A1"),{contentsOnly:true});
      var opname=tempsheet.getRange('E6:G6').getValue();
      tempsheet.copyTo(ssnew).setName(opname);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...