Как скопировать значения из одного листа и вставить их в другой, используя макросы Google Sheets? - PullRequest
4 голосов
/ 19 февраля 2020

Я пишу макросы Google Sheets без особых знаний о синтаксисе.

Я хочу сделать следующее:

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

Я написал следующий код:

function CalcularCruces() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sourceSheet = spreadsheet.getSheetByName("Cruces Activo-Amenazas");
  var destinationSheet = spreadsheet.getSheetByName("Análisis de Riesgos");

  /** Total number of left column values from source table **/
  const maxAmenazas = 29;

  for(var i = 0; i < maxAmenazas; i++) {
    /** Now I need to get the column and row values which are matching with the checkbox 
        and paste them into another table **/
  }

};

Вот пример таблицы ввода и как вывод таблица должна выглядеть после выполнения макросов.

Таблица входных данных Таблица выходных таблиц

Редактировать:

Мне нужно данные для записи рядом с этими столбцами c:

Фактический вывод Actual Output

Желаемый вывод Desired Output

1 Ответ

1 голос
/ 19 февраля 2020

Вы можете сделать следующее:

  • Получить данные из исходного листа с помощью getDataRange и getValues ​​.
  • Для каждого строка в этих данных (исключая строку заголовков, которая была извлечена и удалена из массива с shift ), проверьте, в каких столбцах установлен флажок.
  • Если соответствующий флажок отмечен, записать соответствующие значения на лист назначения с помощью setValues ​​.

Это может быть что-то вроде этого:

function CalcularCruces() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sourceSheet = spreadsheet.getSheetByName("Cruces Activo-Amenazas");
  var destinationSheet = spreadsheet.getSheetByName("Análisis de Riesgos");
  destinationSheet.getRange("A2:B").clearContent();
  var values = sourceSheet.getDataRange().getValues(); // 2D array with all data from source sheet
  var headers = values.shift(); // Remove and retrieve the headers row
  for (var i = 1; i < values[0].length; i++) { // Iterate through each column
    for (var j = 0; j < values.length; j++) { // Iterate through each row
      var activo = values[j][0]; // Activo corresponding to this row
      if (values[j][i]) { // Check that checkbox is marked
        // Get the row index to write to (first row in which column A and B are empty):
        var firstRow = 2;
        var firstCol = 1;
        var numRows = destinationSheet.getLastRow() - firstRow + 1;
        var numCols = 2;
        var firstEmptyRow = destinationSheet.getRange(firstRow, firstCol, numRows, numCols).getValues().filter(function(row) {
          return row[0] !== "" && row[1] !== "";
        }).length + firstRow;
        // Write data to first row with empty columns A/B:
        destinationSheet.getRange(firstEmptyRow, firstCol, 1, numCols).setValues([[headers[i], activo]]);
      }
    }
  }
};

Примечания:

  • Все данные добавляются на целевой лист при каждом запуске сценария, что может привести к дублированию строк. Если вы хотите избежать этого, вы можете использовать clearContent в начале вашего скрипта, после объявления destinationSheet, чтобы удалить весь предыдущий контент (исключая заголовки):
destinationSheet.getRange("A2:B").clearContent();
  • В этом примере число amenazas не жестко запрограммировано, но оно динамически получает число строк в исходном листе с помощью getValues().length. Я предполагаю, что это хороший результат для вас.
  • ОБНОВЛЕНИЕ : Поскольку у вас есть другие столбцы на вашем целевом листе, вы не можете использовать appendRow, но setValues. Сначала вы должны найти индекс первой строки, в которой столбцы A и B пусты. Это достигается с помощью фильтрации массива значений в столбцах AB и фильтрации элементов, в которых два значения пусты (с filter ).

Ссылка:

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