Макрос Google Sheets не завершен - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь проанализировать файл CSV с помощью макросов Google Sheets. Я записал все шаги как отдельные макросы, и один за другим они работают нормально, но когда я объединяю в один макрос, он не работает должным образом. Точка, в которой он перестает работать, - после того, как часть PODdateformatting завершена, и она проходит через первые три строки Daystodeliverformula. Ячейка H2 заполняется формулой, но формула не заполняется автоматически до остальной части столбца. Есть идеи? Или действительно, я все об этом говорю неправильно и нуждаюсь в хорошем разговоре? : -)

function TheWholeShebang() {
  var spreadsheet = SpreadsheetApp.getActive(); // start of DeletedUnwantedColumns
  spreadsheet.getRange('AA:DE').activate();
  spreadsheet.getActiveSheet().deleteColumns(spreadsheet.getActiveRange().getColumn(), spreadsheet.getActiveRange().getNumColumns());
  spreadsheet.getRange('W:X').activate();
  spreadsheet.getActiveSheet().deleteColumns(spreadsheet.getActiveRange().getColumn(), spreadsheet.getActiveRange().getNumColumns());
  spreadsheet.getRange('R:U').activate();
  spreadsheet.getActiveSheet().deleteColumns(spreadsheet.getActiveRange().getColumn(), spreadsheet.getActiveRange().getNumColumns());
  spreadsheet.getRange('H:P').activate();
  spreadsheet.setCurrentCell(spreadsheet.getRange('P1'));
  spreadsheet.getActiveSheet().deleteColumns(spreadsheet.getActiveRange().getColumn(), spreadsheet.getActiveRange().getNumColumns());
  spreadsheet.getRange('A:E').activate();
  spreadsheet.setCurrentCell(spreadsheet.getRange('E1'));
  spreadsheet.getActiveSheet().deleteColumns(spreadsheet.getActiveRange().getColumn(), spreadsheet.getActiveRange().getNumColumns()); // end of DeletedUnwantedColumns

  var spreadsheet = SpreadsheetApp.getActive(); // start of Addcolumnsandheaderlabels
  spreadsheet.getRange('A:F').activate(); 
  spreadsheet.getActiveSheet().insertColumnsAfter(spreadsheet.getActiveRange().getLastColumn(), 6);
  spreadsheet.getActiveRange().offset(0, spreadsheet.getActiveRange().getNumColumns(), spreadsheet.getActiveRange().getNumRows(), 6).activate();
  spreadsheet.getRange('G1').activate();
  spreadsheet.getCurrentCell().setValue('POD Date (formatted)');
  spreadsheet.getRange('H1').activate();
  spreadsheet.getCurrentCell().setValue('Days to Deliver');
  spreadsheet.getRange('G2').activate(); // end of Addcolumnsandheaderlabels

  var spreadsheet = SpreadsheetApp.getActive(); // start of PODdateformatting
  spreadsheet.getRange('G2').activate()
  .setFormula('=DATE(LEFT(D2,4),mid(D2,5,2),right(D2,2))');
  spreadsheet.getActiveRange().autoFillToNeighbor(SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES); // end of PODdateformatting

  var spreadsheet = SpreadsheetApp.getActive(); //start of Daystodeliverformula
  spreadsheet.getRange('H2').activate()
  .setFormula('=NETWORKDAYS(E2,G2,Instructions!$B$15:$B$40)-1');
  spreadsheet.getActiveRange().autoFillToNeighbor(SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES); // end of Daystodeliverformula
};

1 Ответ

0 голосов
/ 02 ноября 2018

После возни с range.autoFillToNeighbor() и неудачей (см. Комментарии выше) я все еще с подозрением относился к этому методу.

Когда я использовал этот метод range.autoFill(), все работало нормально. См. Код ниже.

  // start of PODdateformatting
  //var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('G2').activate().setFormula('=DATE(LEFT(D2,4),mid(D2,5,2),right(D2,2))');
  var sourceRange = spreadsheet.getRange("G2:G2");
  var destination = spreadsheet.getRange("G2:G369");
  sourceRange.autoFill(destination,SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);

  //start of Daystodeliverformula
  var spreadsheet = SpreadsheetApp.getActive();
  var range = spreadsheet.getRange('H2').activate().setFormula('=NETWORKDAYS(E2,G2,Instructions!$B$15:$B$40)-1');
  var sourceRange = spreadsheet.getRange("H2:H2");
  var destination = spreadsheet.getRange("H2:H369");
  sourceRange.autoFill(destination,SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);

Оглядываясь назад, я теперь считаю, что range.autoFillToNeighbor() никогда не подходил для вашего случая использования!

range.autoFillToNeighbor() предполагает построение формул автозаполнения на основе данных, содержащихся в соседних столбцах . Он пытается сделать это разумно, но соседние столбцы не содержат ничего полезного! Удивительно, что это когда-либо работало ... возможно иногда по умолчанию range.autoFill()!

range.autoFill(), с другой стороны, просто дублирует формулу (данные) выше или ниже (НЕ обращаясь за помощью к соседним ячейкам).

Вы можете скопировать и вставить их в соответствующие функции в функции TheWholeShebang(), и все должно работать.

Примечание. Я предполагаю фиксированный диапазон 369 в соответствии с вашими данными, но вы можете рассчитать его на основе фактического размера, если хотите, в случае, если количество строк не изменилось.

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