Скопируйте и вставьте подвижный диапазон в Google Sheets - PullRequest
0 голосов
/ 07 января 2020

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

По существу, на листе MS у меня есть диапазон данных (A2:O23) с формулами, которые я хочу сохранить фиксированными (как, например, всегда ссылаться на один и тот же диапазон на другом листе).

Моя цель состоит в том, чтобы при запуске скрипта этот блок формул копировался и вставлялся из следующей пустой строки (в тех же столбцах [A:O]), а предыдущий блок (A2:O23) копировал и вставьте его в качестве значений.

Затем, каждый раз, когда скрипт запускается, он делает то же самое, копируя последний блок из 22 строк ниже себя и вставляя себя в качестве значений. По сути, это приводит к созданию длинного списка данных с последним (читай наименьшим) диапазоном, являющимся формулами, а все вышеперечисленные значения являются значениями.

Например, результаты первого запуска должны быть следующими: A24:O45 теперь показывает ту же формулу и что A2:O23 показаны только как значения. В следующий раз A24:O45 будет заморожен как значения, а A46:O67 теперь будут формулами.

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

Я понимаю, что это может быть не совсем понятно, но я рад задать любые вопросы и высоко ценю любые усилия Сделано, чтобы помочь.

Спасибо

Ответы [ 2 ]

1 голос
/ 08 января 2020

Если я вас правильно понимаю, вы хотите:

  • Скопировать последние 22 строки вашего листа (столбцы A - O) в следующие 22 строки (включая формулы).
  • Копирование / вставка в исходный диапазон только в качестве значений.

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

function copyPasteValues() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("MS"); // Name of your sheet (change if that's necessary)
  var lastRow = sheet.getLastRow();
  var firstCol = 1; // First column to copy
  var numCols = 15; // Number of columns to copy
  var numRows = 22; // Number of rows to copy
  if (lastRow > numRows) { // Check if the sheet has at least 23 rows with content (otherwise it would give error when copying the range)
    var originRange = sheet.getRange(lastRow - numRows + 1, firstCol, numRows, numCols);
    var destRange = sheet.getRange(lastRow + 1, firstCol, numRows, numCols);
    originRange.copyTo(destRange); // Copying with formulas to next 22 rows
    originRange.copyTo(originRange, {contentsOnly:true}); // Copying only values to same range
  }
}

Основной метод, на который следует обратить внимание, это copyTo, который можно использовать для копирования данных как есть, с включенными формулами или только значения , установив параметр {contentsOnly:true} ( copyValuesToRange тоже можно использовать).

Я надеюсь, что это любая помощь.

0 голосов
/ 08 января 2020
function copypastepaste() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rows=sh.getLastRow();
  if(rows>22) {
    var rg=sh.getRange(sh.getLastRow()-21,1,22,16);
    var vA=rg.getDisplayValues();
    var fA=rg.getFormulas();
    var nrg=sh.getRange(sh.getLastRow()+1,1,22,16);
    nrg.setFormulas(fA);
    rg.setValues(vA);
  }      
}
...