Чтобы добиться желаемого результата разбиения входного списка на несколько строк, вы можете попробовать следующий подход.
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]]