Копировать и передавать NamedRange / Whole Line - PullRequest
0 голосов
/ 07 ноября 2019

Я использовал приведенный ниже скрипт для копирования и вставки всех предыдущих строк во вставленной строке ранее в Google Sheets.

  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('20:20').activate();
  spreadsheet.getActiveSheet().insertRowsBefore(spreadsheet.getActiveRange().getRow(), 1);
  spreadsheet.getActiveRange().offset(0, 0, 1, spreadsheet.getActiveRange().getNumColumns()).activate();
  spreadsheet.getRange('21:21').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('L20').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
  spreadsheet.getRange('H20').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
};

Поскольку у меня будут вставки ниже друг друга, всякий раз, когда я использую верхнююодни изменит строку для копирования на другие. Я хотел бы удалить зависимость от выражения ('20: 20 ') и подумать, что NamedRange - это путь.

Можно ли скопировать значения целой строки или именованного диапазона на одном листе и вставитьих на том же листе, просто создавая строку выше?

1 Ответ

0 голосов
/ 08 ноября 2019

Используя Службу Porperties [1], вы можете исправить вашу проблему, я отредактировал код, связанный с вашей электронной таблицей, следующим образом:

function PlusMP() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('5:5').activate();
  spreadsheet.getActiveSheet().insertRowsBefore(spreadsheet.getActiveRange().getRow(), 1);
  spreadsheet.getActiveRange().offset(0, 0, 1, spreadsheet.getActiveRange().getNumColumns()).activate();
  spreadsheet.getRange('6:6').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('L5').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
  spreadsheet.getRange('H5').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});

  //Set offset property
  var scriptProperties = PropertiesService.getScriptProperties();
  var offset = Number(scriptProperties.getProperty('offset'));

  if ( offset == null) {
    scriptProperties.setProperty('offset', 1);
  }
  else {
    scriptProperties.setProperty('offset', offset + 1);
  }
};

function PlusCOMP() {
  //Get offset property
  var scriptProperties = PropertiesService.getScriptProperties();
  var offset = Number(scriptProperties.getProperty('offset'));

  if(offset == null) {
    offset = 0;
  }
  var row = 10 + offset;
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange(row + ':' + row).activate();
  spreadsheet.getActiveSheet().insertRowsBefore(spreadsheet.getActiveRange().getRow(), 1);
  spreadsheet.getActiveRange().offset(0, 0, 1, spreadsheet.getActiveRange().getNumColumns()).activate();
  spreadsheet.getRange(row + ':' + row).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('L' + row).activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
  spreadsheet.getRange('H' + row).activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
};

function resetOffset() {
      PropertiesService.getScriptProperties().setProperty('offset', 0);
}

Когда функция PlusMP будет запущена, она установит или обновитoffset, и при запуске функции PlusCOMP оно будет использовать то же свойство offset для соответствующей вставки строк.

[1] https://developers.google.com/apps-script/reference/properties/properties

...