Как передать ссылку на ячейку для пользовательской функции Script Script?

При условии, что:

A1 = 3
B1 = customFunc(A1)  // will be 3

В моей пользовательской функции:

function customFunc(v) {
  return v;
}

vбудет 3. Но я хочу получить доступ к объекту ячейки A1.


Ниже приводится пояснение ниже.

Входные данные:

+---+---+
|   | A |
+---+---+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+---+---+

Я хочу скопировать A1:A4в B1:C2пользовательскую функцию.

Желаемый результат:

+---+---+---+---+
|   | A | B | C |
+---+---+---+---+
| 1 | 1 | 1 | 2 |
| 2 | 2 | 3 | 4 |
| 3 | 3 |   |   |
| 4 | 4 |   |   |
+---+---+---+---+

google-apps-script,google-spreadsheet,

1

Ответов: 1


Ниже приводится пояснение ниже.

Входные данные:

+---+---+
|   | A |
+---+---+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+---+---+

Я хочу скопировать A1:A4в B1:C2пользовательскую функцию.

Желаемый результат:

+---+---+---+---+
|   | A | B | C |
+---+---+---+---+
| 1 | 1 | 1 | 2 |
| 2 | 2 | 3 | 4 |
| 3 | 3 |   |   |
| 4 | 4 |   |   |
+---+---+---+---+
11
1

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

function customFunc(value) {
  if (!Array.isArray(value)) {
    return value;
  }
  // Filter input that is more than a single column or single row.
  if (value.length > 1 && value[0].length > 1) {
    throw "Must provide a single value, column or row as input";
  }
  var result;
  if (value.length == 1) {
    // Extract single row from 2D array.
    result = value[0];
  } else {
    // Extract single column from 2D array.
    result = value.map(function (x) {
      return x[0];
    });
  }
  // Return the extracted list split in half between two rows.
  return [
    result.slice(0, Math.round(result.length/2)),
    result.slice(Math.round(result.length/2))
  ];
}

Обратите внимание, что это не требует работы со ссылками на ячейки. Он просто занимается манипулированием входным 2D-массивом и возвратом преобразованного 2D-массива.

Использование функции дает следующие результаты:

  • A1:A4жестко закодирован, B1содержит=customFunc(A1:A4)

    +---+---+---+---+
    |   | A | B | C |
    +---+---+---+---+
    | 1 | a | a | b |
    | 2 | b | c | d |
    | 3 | c |   |   |
    | 4 | d |   |   |
    +---+---+---+---+
  • A1:D4жестко закодирован, A2содержит=customFunc(A1:D4)

    +---+---+---+---+---+
    |   | A | B | C | D |
    +---+---+---+---+---+
    | 1 | a | b | c | d |
    | 2 | a | b |   |   |
    | 3 | c | d |   |   |
    +---+---+---+---+---+
  • A1:B2жестко закодировано, A3содержит =customFunc(A1:B2)сообщение об ошибке: «Должно предусматривать одно значение, столбец или строку в качестве входных данных»,

    +---+---+---+---------+
    |   | A | B |    C    |
    +---+---+---+---------+
    | 1 | a | c | #ERROR! |
    | 2 | b | d |         |
    +---+---+---+---------+

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


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

Этот подход имеет следующие ограничения:

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

Функция:

/**
 * @param {Object|Object[][]} value The cell value(s).
 * @param {function=} opt_transform An optional function to used to transform the values.
 * @returns {Object|Object[][]} The transformed values.
 */
function customFunc(value, opt_transform) {
  transform = opt_transform || function(x) { return x; };
  if (!Array.isArray(value)) {
    return transform(value);
  }
  // Filter input that is more than a single column or single row.
  if (value.length > 1 && value[0].length > 1) {
    throw "Must provide a single value, column or row as input";
  }
  var result;
  if (value.length == 1) {
    // Extract single row from 2D array.
    result = value[0].map(transform);
  } else {
    // Extract single column from 2D array.
    result = value.map(function (x) {
      return transform(x[0]);
    });
  }
  // Return the extracted list split in half between two rows.
  return [
    result.slice(0, Math.round(result.length/2)),
    result.slice(Math.round(result.length/2))
  ];
}

И быстрый тест:

function test_customFunc() {
  // Single cell.
  Logger.log(customFunc(2, function(x) { return x * 2; }));

  // Row of values.
  Logger.log(customFunc([[1, 2, 3 ,4]], function(x) { return x * 2; }));

  // Column of values.
  Logger.log(customFunc([[1], [2], [3], [4]], function(x) { return x * 2; }));
}

Который регистрирует следующий вывод:

[18-06-25 10:46:50:160 PDT] 4.0
[18-06-25 10:46:50:161 PDT] [[2.0, 4.0], [6.0, 8.0]]
[18-06-25 10:46:50:161 PDT] [[2.0, 4.0], [6.0, 8.0]]
Google-приложения-скрипт, Google-таблицы,
Похожие вопросы
Яндекс.Метрика