Я працюю над цим увесь ранок і бачу докази того, що обговорюються вищевикладені невідповіді. Чуйне, і я обидва хочу АДРЕСУ переданої комірки, а не значення. І відповідь дуже проста. Це неможливо зробити.
Я знайшов деякі вирішення, які залежать від того, щоб з'ясувати, яка клітина містить формулу. Важко сказати, якби це допомогло 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 - це Софія (Виграє - PrevWins) / (Втрати - PrevLosses)
(7 - 4) / (4 - 2) = 1,5
Але ми не знаємо, у якому рядку раніше з'являлася Софія.
Це все можна зробити за допомогою VLOOKUP, якщо ви введете жорсткий код A як стовпець імені. Після VLOOKUP я отримав #NA (ім’я не знайдено) та # DIV0 (нульовий знаменник) і обернув його = IF (Якщо (...)), щоб показати більш приємний текст у цих умовах. Тепер у мене було жахливо велике вираження, яке було непростим і нездійсненним. Тому я хотів розширення макросу (не існує) або спеціальних функцій.
Але коли я зробив помічник SubtractPrevValue (комірка), він отримував "7" замість B5. Немає вбудованого способу отримання об'єктів комірок або діапазону від переданих аргументів.
Якщо я змушу користувача ввести ім'я комірки в подвійних лапках, я можу це зробити ... SubtractPrevValue ("B5"). Але це дійсно підкреслення копіювання / вставки та відносні особливості комірок.
Але потім я знайшов рішення.
SpreadsheetApp.getActiveRange () КЛІТИНА, що містить формулу. Це все, що мені справді потрібно було знати. Номер рядка Наступна функція приймає NUMERIC номер стовпця і віднімає попереднє виникнення в цьому стовпці.
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
}
Але потім я виявив, що це дійсно ДІЙСНО повільно. Одна і дві секунди затримуються під час відображення "Думаю ..." Тому я повернувся до масово нерозбірливої, незрозумілої формули робочого аркуша.