Скрипт Google Sheet, который читает ячейку "a" и записывает в ячейку "b" значение, отличное от ячейки "a" - PullRequest
0 голосов
/ 03 июля 2018

Доброе утро всем,

Мне нужно написать скрипт для Google Sheets, который проверяет, содержит ли ячейка в строке значение, она записывает значение в столбец в этой строке. Например, если ячейка в строке 2, столбец G имеет значение, отличное от «», напишите «Новая проблема» в ячейку строки 2, столбец C. У меня пока есть это:

// Purpose: To populate cell in Column G if another in row cell contains 
// something other than null, or ""

function formatSpreadsheet() {
  var sheet = SpreadsheetApp.getActive();
  var data = sheet.getRange("C3:1000").getValues();

  if (data !== "") {
    sheet.getRange("G3:G1000").setValue("New Issue");

  }
}

Проблема заключается в том, что если значение найдено в C3 - C1000, оно записывает «Новый выпуск» во все ячейки в диапазоне G3 - G1000. Мне нужно это туда, где он только записывает это в соответствующую строку. Таким образом, если значение C4 имеет значение, G4 должно быть установлено на «Новый выпуск», а если значение C5 имеет значение, то G5 должно быть установлено на «Новый выпуск» и т. Д.

Надеюсь, это имеет смысл, я могу попытаться прояснить это как можно больше. Я не знаю, полезны ли «операторы IF» в этом сценарии или нужна ли мне каждая петля. Я не знаю, как использовать для каждого, хотя, к сожалению. Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Решение Apps Script для этого запроса должно проверять каждый индекс массива и записывать в соответствующий индекс в другом диапазоне. Чтобы максимизировать скорость, мы хотим использовать пакетные операции getValues() и setValues, когда это возможно. Одно из возможных решений будет выглядеть так:

function setNewIssueLabels() {
  const sourceRangeA1 = "C3:C1000", destStart = "G3";

  const sheet = SpreadsheetApp.getActive().getActiveSheet(),
        source = sheet.getRange(sourceRangeA1).getValues();
  if (!source.length || source[0].length !== 1)
    throw new Error("Expected single-column source range with at least 1 row");

  // Include the original row index in the array.
  const inputs = source.map(function (row, index) {
    row.unshift(index);
    return row;
  })
  // Keep rows where the 2nd index (the original content) is not a null string.
  .filter(function (iRow) {
    return iRow[1] !== "";
  });

  var dest = sheet.getRange(destStart);
  if (dest.getNumRows() < source.length)
    dest = dest.offset(0, 0, source.length, 1)
  const outputs = dest.getValues();

  // For every row in 'inputs' (read: every row in the source range that
  // has a value), do stuff.
  inputs.forEach(function (iRow) {
    var originalIndex = iRow[0];
    // var originalContent = iRow[1];
    // var isActualNewIssue = outputs[originalIndex] === "";
    // if (isActualNewIssue) {
    outputs[originalIndex] = "New Issue";
    // } else {
    //   foo();
    // }
  });

  /**
   * Overwrite the contents of the destination range with the 'outputs' values,
   * which will be whatever was previously there, and possibly additional
   * cells with "new Issue"
   */
  dest.setValues(output);
}

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

0 голосов
/ 03 июля 2018

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

"= ArrayFormula (если (len (C2: C)," New Issue ",))" это все, что нужно.

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