Скопируйте диапазон данных и вставьте на новую страницу, а затем повторите

#google-apps-script #google-sheets

Вопрос:

Я пытаюсь скопировать диапазон с листа «Полный» и вставить значения только на новый лист «Дамп». В то время как приведенный ниже макрос выполняет свое действие один раз, я восстанавливаю исходный диапазон данных (полный), поэтому я хочу скопировать этот новый набор и добавить его на ту же страницу вывода, проиндексировав до пустой строки и сохранив первые вставленные данные. Также затем проделать это 100 раз. Перекодированный макрос приведен ниже, и мне нужно понять сценарий для добавления в;

  • повторите функцию копирования/вставки 100 раз, а также
  • смещение диапазона вставки на заданное количество строк.

Извините, настоящий новичок в редактировании макросов Google sheet. Макрос Excel, который я использую, не переводится. Ценю любые ответы, которые у вас есть.

 function xmacro() {
      var spreadsheet = SpreadsheetApp.getActive();
      spreadsheet.getRange('A1').activate();
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Full'), true);
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Dump'), true);
      spreadsheet.getRange('Full!BK3:BT34').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);```
};
 

Комментарии:

1. Работа с макросами приведет вас только к этому. Вам нужно научиться работать с листами и диапазонами.

Ответ №1:

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

Основные Понятия

Вот некоторые основные концепции, на понимание которых у меня ушла целая вечность, потому что большая часть документации предполагает, что вы уже владеете Javascript.

Диапазон-это 2-мерный массив, содержащий по одному массиву для каждой строки, а содержимым этого массива являются столбцы:

 someRange = [
              [row1Col1, row1Col2, row1Col3, row1Col4], 
              [row2Col1, row2Col2, row2Col3, row2Col4], 
              [row3Col1, row3Col2, row3Col3, row3Col4]
            ]
 

Чтобы получить доступ к определенному значению, вам нужно сослаться на массив строк, а затем на индекс нужного столбца.
Подумайте об этом, как о номерах гостиничных номеров. Первая часть номера-это этаж,
а вторая часть-конкретная комната на этом этаже.

Вы получаете доступ к массивам, вызывая имя массива, затем в квадратных скобках указываете номер нужного элемента.

Массивы индексируются начиная с 0, поэтому для получения строки 1 вы бы использовали:

someRange[0] would return the inner array [row1Col1, row1Col2, row1Col3] .

Но это не дает вам конкретных значений ячеек, поэтому вы бы использовали второй набор скобок для доступа к столбцу в этой строке: someRange[0][1] = 'row1Col2'

Массивы также содержат встроенную информацию, поэтому вы можете найти длину массива с помощью Array.length без скобок.

Поскольку строки находятся во внешнем массиве, вы можете получить количество строк, посмотрев, сколько существует внутренних массивов.

someRange.length = 3 В массиве someRange есть 3 массива строк.

Вы можете сделать то же самое со столбцами, так как количество столбцов равно количеству элементов в массиве. Чтобы получить количество элементов в первой строке, вы бы использовали:

someRange[0].length - which would be 4 И поскольку диапазон содержит одинаковое количество столбцов для каждой строки, вы можете выбрать любую строку, чтобы получить количество столбцов (как правило, всегда есть исключения).

Код

Первая функция создаст пользовательский пункт меню для запуска кода.

 // create a new menu item for your custom function
function onOpen(){
  SpreadsheetApp.getUi().createMenu()
                        .addItem('100 Copies', 'lotsOfCopies')
                        .addToUi();
}

function lotsOfCopies() {
  var ss = SpreadsheetApp.getActive();
  var copySheet = ss.getSheetByName('yourCopySheetName');
  var pasteSheet = ss.getSheetByName('yourPasteSheetName');
  
  // the range you wish to copy, change to fit your needs
  var copyRange = copySheet.getRange('A1:B7');
  var copyValues = copyRange.getValues();
  

  var copyRows = copyValues.length;
  var copyCols = copyValues[0].length;

  // define the first row to be pasted into
  var pasteRow = 1;
  
  // define the left side column of the range to be pasted into
  var pasteCol = 1

  // build a loop that does the same thing 100 times, 
  // and each time offsets the paste range by the number of rows in the copy range

  for (var i = 0; i < 100; i  ) {
    // for every iteration after the first, 
    // add the number of rows in the copy range to the variable 'row'
    // example if there are 10 rows in the copy range then 
    // iteration 1 row = 1   Iterartion 2 row = 11,  Iteration 3 row = 21
    
    if (i > 0) {
      pasteRow =  pasteRow    copyRows
    }
    
    // build the range to paste into - it starts on pasteRow and paste col, 
    // and is as many rows as the copied range, and as many columns as the copied range
    let pasteRange = pasteSheet.getRange(pasteRow, pasteCol, copyRows, copyCols);
    
    // put the values from copyValues into the pasteRange
    pasteRange.setValues(copyValues);
  }
}  
 

Комментарии:

1. Вот учебник по циклам — w3schools.com/js/js_loop_for.asp

2. Фантастический Крис… Теперь я отлично справляюсь с повторной итерацией ( для (var i = 0; i Большое, большое спасибо!

3. Я рад, что смог помочь. Я помню, как тяжело все начиналось. Если вам нравится ответ, не могли бы вы щелкнуть флажок принять ответ.

Ответ №2:

 function xmacro() {
      const ss = SpreadsheetApp.getActive();
      const ssh = ss.getSheetByName('Full')
      const dsh = ss.getSheetByName('Dump')
      ssh.getRange('BK3:BT34').copyTo(dsh.getRange('A1'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
}