Как оптимизировать код для копирования одного диапазона листов в другой диапазон листов - PullRequest
3 голосов
/ 06 октября 2019

Мой код ниже работает, но я думаю, что есть гораздо более элегантный способ сделать это. Я хочу скопировать часть выбранной строки (D: R) на листе клиента (источник) на тестовый лист (место назначения) в первую пустую строку на этом листе (C: Q).

код работает, но выглядит просто неэффективно / не элегантно.

function rowSelected() {  
  var customer_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Customer_Info");
  var invoice_sheet =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test");
  var customer_selection_row = customer_sheet.getActiveRange().getRow();
  //Browser.msgBox(customer_selection_row);

  var customer_selection_start = 'D' + customer_selection_row;
  var customer_selection_end = 'R' + customer_selection_row;
  var customer_selection_range = customer_selection_start + ':' + customer_selection_end;
  var source_range = customer_sheet.getRange(customer_selection_range);
  customer_sheet.setActiveRange(source_range);
  //Browser.msgBox(source_range.getA1Notation());

  var invoice_selection_row = getFirstEmptyRowWholeRow();
  var invoice_selection_start = 'C' + invoice_selection_row;
  var invoice_selection_end = 'Q' + invoice_selection_row;
  var invoice_selection_range = invoice_selection_start + ':' + invoice_selection_end;
  var destination_range = invoice_sheet.getRange(invoice_selection_range);
  invoice_sheet.setActiveRange(destination_range);
  //Browser.msgBox(destination_range.getA1Notation());

  customer_sheet.setActiveRange(source_range).copyTo((destination_range), {contentsOnly:true});
}

Я думаю, что есть способ сделать это с меньшим количеством кода.

1 Ответ

4 голосов
/ 07 октября 2019
  • Вы хотите скопировать столбец «D» в «R» в строке активного диапазона листа Customer_Info в столбец «C» в «Q» в строке, извлеченной с помощью getFirstEmptyRowWholeRow()листа Test.
  • Вы хотите активировать диапазон источника.

Если мое понимание верно, как насчет этой модификации?

Точки модификации:

  • SpreadsheetApp.getActiveSpreadsheet() объявляется один раз как `ss``.
  • getRange(row, column, numRows, numColumns) используется вместо getRange(a1Notation).
  • О destination_range,если задана начальная ячейка, из нее можно скопировать исходный диапазон.
  • Когда активным листом является Customer_Info, скрипт запускается.

Модифицированный скрипт:

function rowSelected() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var customer_sheet = ss.getActiveSheet();
  if (customer_sheet.getSheetName() == "Customer_Info") {
    var invoice_sheet = ss.getSheetByName("Test");
    var activeRange = ss.getActiveRange();
    var source_range = customer_sheet.getRange(activeRange.getRow(), 4, activeRange.getNumRows(), 15).activate();
    var destination_range = invoice_sheet.getRange(getFirstEmptyRowWholeRow(), 3); // or invoice_sheet.getRange("C" + getFirstEmptyRowWholeRow())
    source_range.copyTo(destination_range, {contentsOnly: true});
  }
}
  • getFirstEmptyRowWholeRow() вашего сценария также используется для вышеуказанного измененного сценария.
  • В этом измененном сценарии, если вы хотите выбрать диапазон "A1: A3" налисте Customer_Info и запустить скрипт, значения ячеек "D1: R3" копируются из ячейки столбца "C" и строки getFirstEmptyRowWholeRow().

Ссылки:

Если я неправильно понял ваш вопрос, и это не то, что вы хотите,Я прошу прощения.

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