Скрипт Googlesheet для копирования диапазона, только если он не пустой или ошибка - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь скопировать определенный диапазон из другого листа (или того же самого), но копировать его только в том случае, если диапазон не пуст или у вас есть сообщение об ошибке, например (# N / A, #REF, et c). ).

Например:

  • Лист 1: содержит исходный лист данных.
  • Лист 2: содержит скопированные данные из сценария, но данные здесь перезаписывается только в том случае, если исходные файлы не пусты или не содержат ошибок.
function test() {  
  SpreadsheetApp.getActive().getSheetByName('sheet2').getRange('A2').setValue('=QUERY(sheet1!A2:E355, "SELECT A, B, C, D, E LIMIT 200",1)')
}

Примечание. Я использовал здесь QUERY для копирования, но я уверен, что это не лучший вариант для копирования, поскольку он этого не делает. сохранить значение в другом листе, но только для демонстрации.

1 Ответ

1 голос
/ 25 марта 2020

Если я правильно вас понял, вы хотите скопировать свой диапазон на другой лист, если выполнены следующие условия:

  • Исходный диапазон не содержит ни одной ячейки с ошибкой.
  • Все пустые строки в исходном диапазоне (если есть) находятся в конце диапазона (нет строки со значениями после пустой строки).

Если это правильно, вы можете сделать следующее (проверьте встроенные комментарии):

function copyRange() {
  var ss = SpreadsheetApp.getActive();
  var sourceSheet = ss.getSheetByName("source_sheet"); // Source sheet name
  var targetSheet = ss.getSheetByName("target_sheet"); // Target sheet name
  var A1notation = "C6:E23"; // A1 notation of the source range (please change if necessary)
  var sourceRange = sourceSheet.getRange(A1notation);
  var sourceValues = sourceRange.getValues();
  var errors = ["#REF!", "#N/A", "#DIV/0!", ...]; // Array of errors (incomplete)
  for (var i = 0; i < sourceValues.length; i++) { // Iterate through all values in source range
    for (var j = 0; j < sourceValues[i].length; j++) {
      if (errors.includes(sourceValues[i][j])) return; // End execution if error found in a cell
    }
  }
  // Check if there is an inbetween empty row:
  var emptyRowInBetween = sourceValues.map(rowValues => { 
    return rowValues.every(cellValue => {
      return cellValue === "";
    });
  }).join().indexOf("true,false") !== -1;
  var targetRange = targetSheet.getRange("A1"); // Range to copy to (please change if necessary)
  if (!emptyRowInBetween) sourceRange.copyTo(targetRange); // Copy range to specified destination
}

Обновление:

Если вы хотите копировать только значения, а не формулы, и т. д. c., вы можете сделать это:

sourceRange.copyTo(targetRange, SpreadsheetApp.CopyPasteType.PASTE_VALUES);

Примечание:

Ссылка:

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