Я работал над этим все утро и видел доказательства того, что обсуждают вышеупомянутые не ответы. Смысл и я оба хотим АДРЕС переданной ячейки, а не значение. И ответ очень прост. Это не может быть сделано.
Я нашел некоторые обходные пути, которые основаны на выяснении, в какой ячейке содержится формула. Трудно сказать, помогло ли это Senseful выше. Так что я делал?
The data.
[A] [B] [C] [D] [E] [F] [H]
[1] Name Wins Losses Shots Points Fouls Most recent
WL Ratio
[2] Sophia 4 2 15 7 1 0
[3] Gloria 11 3 11 6 0 0
[4] Rene 2 0 4 0 0 0
[5] Sophia 7 4 18 9 1 1.5
Колонка H - это София (Победы - Предыдущие победы) / (Потери - Предыдущие потери)
(7 - 4) / (4 - 2) = 1,5
Но мы не знаем, в какой строке появилась София. Все
это можно сделать с помощью VLOOKUP, если вы жестко закодировали A в качестве столбца имени. После VLOOKUP я получил несколько #NA (имя не найдено) и # DIV0 (нулевой знаменатель) и заключил их в = IF (IF (...)), чтобы показать более приемлемый текст в этих условиях. Теперь у меня было чудовищно большое выражение, которое было громоздким и неприемлемым. Поэтому я хотел расширения макроса (не существует) или пользовательских функций.
Но когда я сделал вспомогательный SubtractPrevValue (ячейка), он получал «7» вместо B5. Не существует встроенного способа получить объекты ячейки или диапазона из переданных аргументов.
Если я заставлю пользователя вручную ввести имя ячейки в двойных кавычках, тогда я смогу сделать это ... SubtractPrevValue ("B5"). Но это действительно копирование / вставка подколенного сухожилия и относительные особенности ячейки.
Но потом я нашел обходной путь.
SpreadsheetApp.getActiveRange () - это клетка, которая содержит формулу. Это все, что мне действительно нужно было знать. Номер строки. Следующая функция берет числовой номер столбца и вычитает предыдущее вхождение в этот столбец.
function SubtractPrevValue(colNum)
{
var curCell = SpreadsheetApp.getActiveRange();
var curSheet = curCell.getSheet();
var curRowIdx = curCell.getRowIndex();
var name = curSheet.getRange(curRowIdx, 1).getValue(); // name to match
var curVal = curSheet.getRange(curRowIdx, colNum).getValue();
var foundRowIdx = -1;
for (var i=curRowIdx-1;i>1;i--)
{
if (curSheet.getRange(i, 2).getValue() == name)
{
return curVal - curSheet.getRange(i, colNum).getValue();
}
}
return curVal; //default if no previous found
}
Но потом я обнаружил, что это действительно очень медленно. Задержка на одну и две секунды, когда отображается «Мышление ...» Так что я вернулся к совершенно неразборчивой, не поддерживаемой формуле листа.