Я хочу создать функцию, которая принимает диапазон ... что-то вроде:
function myFunction(range) {
var firstColumn = range.getColumn();
// loop over the range
}
Ячейка будет ссылаться на него, используя:
=myFunction(A1:A4)
Проблема в том, что когда я пытаюсь сделать это, параметр кажется, что он только передает значения в функцию. Таким образом, я не могу использовать любой из методов Range, таких как getColumn()
. Когда я пытаюсь это сделать, выдается следующая ошибка:
error: TypeError: Невозможно найти функцию getColumn в объекте 1,2,3.
Как я могу отправить фактический диапазон, а не только значения одной из моих пользовательских функций?
range
трактуется как 2d массив javascript Вы можете получить количество строк сrange.length
и количество столбцов сrange[0].length
. Если вы хотите получить значение из строкиr
и столбцаc
использования:range[r][c]
.источник
=myFunction(C1:F1)
то внутри функцииrange[0][0]
вернет значениеC1
,range[0][1]
вернет значениеD1
,range[0][2]
вернет значениеE1
и т. Д. Это ясно?=weightedAverage(B3:D3,$B$2:$D$2)
, я хотел бы сделать функцию более защищенной от ошибок, не отправляя 2-й аргумент (т.е. я хочу вызвать его как=weightedAverage(B3:D3)
), а затем чтобы код автоматически знал, что диапазон начинается с B и заканчивается на D, поэтому он получает соответствующие значения из 2-го ряда. Примечание: значение «2» может быть жестко закодировано, но «B» не должно быть жестко закодировано.B
от данногоrange
. Я бы посоветовал вам ознакомиться с руководством по началу работы ( goo.gl/hm0xT ), если вы этого еще не сделали, чтобы понять, как вы можете играть с диапазонами и ячейками.При передаче
Range
функции электронной таблицы Google платформа выполняетсяparamRange.getValues()
неявно, и ваша функция получает значения в диапазоне в виде двумерного массива строк, чисел или объектов (напримерDate
).Range
Объект не передается вашей пользовательской функции электронной таблицы.TYPEOF()
Ниже функция покажет вам , какие данные вы получаете в качестве параметра. Формула=TYPEOF(A1:A4)
вызовем скрипт так:
источник
В качестве альтернативы, вдохновленной комментарием @Lipis, вы можете вызвать вашу функцию с координатами строки / столбца в качестве дополнительных параметров:
В этой форме формулу можно легко скопировать (или перетащить) в другие ячейки, и ссылки на ячейки / диапазоны будут автоматически скорректированы.
Ваша функция Script должна быть обновлена следующим образом:
Обратите внимание, что
getRange
функция принимаетstartRow
,startColumn
а затем количество строк и количество столбцов - не конец строки и конец столбца. Итак, арифметика.источник
Это можно сделать . Можно получить ссылку на переданный диапазон, анализируя формулу в активной ячейке, которая является ячейкой, содержащей формулу. Это делает предположение, что пользовательская функция используется сама по себе, а не как часть более сложного выражения: например
=myfunction(A1:C3)
, нет=sqrt(4+myfunction(A1:C3))
.Эта функция возвращает индекс первого столбца переданного диапазона.
источник
Я продлил прекрасную идею в user79865 игрового ответа , чтобы заставить его работать на более случаи и несколько аргументов, передаваемые в пользовательской функцию.
Чтобы использовать его, скопируйте приведенный ниже код, а затем в свой вызов пользовательской функции,
GetParamRanges()
например, передав ему имя своей функции:Вот пример, чтобы вернуть цвет ячейки:
Вот код и еще несколько объяснений:
источник
Я различаю две разные пользовательские функции в электронной таблице Google с помощью скрипта Google Apps:
Первая функция способна сделать практически все. Помимо вызова службы электронных таблиц, она может вызывать GmailApp или любую службу, предоставляемую Google. Вызовы API замедляют процесс. Диапазон может быть передан или получен через функцию, чтобы получить доступ ко всем доступным методам.
Вторая функция ограничена только «электронной таблицей». Здесь можно использовать JavaScript для обработки данных. Эти функции обычно очень быстрые. Переданный диапазон - это не более чем 2D-массив, содержащий значения.
В своем вопросе вы начинаете с вызова
.getColumn()
метода. Это ясно указывает на то, что вам нужна пользовательская функция типа 1, как описано выше.См. Следующий ответ о том, как настроить электронную таблицу и лист, чтобы создать пользовательскую функцию.
источник
Я работал над этим несколько месяцев назад и придумал очень простой ключ: создайте новый лист с именем каждой ячейки в качестве содержимого: ячейка A1 может выглядеть так:
Назовите лист «Реф». Затем, когда вам нужна ссылка на ячейку в виде строки вместо содержимого, вы используете:
Конечно, вам нужно проверить, передается ли функции строка (одна ячейка) или 1D или 2D Array. Если вы получите массив, он будет иметь все адреса ячеек в виде строк, но из первой ячейки, а также по ширине и высоте вы можете определить, что вам нужно.
источник
Я работал над этим все утро и видел доказательства того, что обсуждают вышеупомянутые не ответы. Смысл и я оба хотим АДРЕС переданной ячейки, а не значение. И ответ очень прост. Это не может быть сделано.
Я нашел некоторые обходные пути, которые основаны на выяснении, в какой ячейке содержится формула. Трудно сказать, помогло ли это Senseful выше. Так что я делал?
Колонка H - это София (Победы - Предыдущие победы) / (Потери - Предыдущие потери)
(7 - 4) / (4 - 2) = 1,5
Но мы не знаем, в какой строке появилась София. Все
это можно сделать с помощью VLOOKUP, если вы жестко закодировали A в качестве столбца имени. После VLOOKUP я получил несколько #NA (имя не найдено) и # DIV0 (нулевой знаменатель) и заключил их в = IF (IF (...)), чтобы показать более приемлемый текст в этих условиях. Теперь у меня было чудовищно большое выражение, которое было громоздким и неприемлемым. Поэтому я хотел расширения макроса (не существует) или пользовательских функций.
Но когда я сделал вспомогательный SubtractPrevValue (ячейка), он получал «7» вместо B5. Не существует встроенного способа получить объекты ячейки или диапазона из переданных аргументов.
Если я заставлю пользователя вручную ввести имя ячейки в двойных кавычках, тогда я смогу сделать это ... SubtractPrevValue ("B5"). Но это действительно копирование / вставка подколенного сухожилия и относительные особенности ячейки.
Но потом я нашел обходной путь.
SpreadsheetApp.getActiveRange () - это клетка, которая содержит формулу. Это все, что мне действительно нужно было знать. Номер строки. Следующая функция берет числовой номер столбца и вычитает предыдущее вхождение в этот столбец.
Но потом я обнаружил, что это действительно очень медленно. Задержка на одну и две секунды, когда отображается «Мышление ...» Так что я вернулся к совершенно неразборчивой, не поддерживаемой формуле листа.
источник
Вместо предоставления объекта «Диапазон» разработчики Google передают в основном случайный тип данных. Итак, я разработал следующий макрос, чтобы распечатать значение ввода.
источник
Есть моя подборка предыдущих ответов
Он принимает текущую формулу и проверяет, является ли это Range.
=GFR(A1:A5;1;C1:C2;D1&D2)
возвращаетсяДля полного состава ТС можно назвать примерно так
источник
Создайте функцию и передайте диапазон в качестве аргумента:
Использование в таблице:
Это покажет значение как
sum(A1:A10)
.источник