Pracowałem nad tym przez cały ranek i widziałem dowody na to, co omawiają powyższe nie-odpowiedzi. Rozsądny i oboje chcemy ADRESU przekazanej komórki, a nie wartości. Odpowiedź jest bardzo łatwa. Nie da się tego zrobić.
Znalazłem kilka obejść, które polegają na ustaleniu, która komórka zawiera formułę. Trudno powiedzieć, czy pomogłoby to Senseful powyżej. Co ja robiłem?
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
Kolumna H to Sophia's (Wygrane - PrevWins) / (Przegrane - PrevLosses)
(7–4) / (4–2) = 1,5
Ale nie wiemy, w którym wierszu wcześniej pojawiła się Sophia.
Można to wszystko zrobić za pomocą WYSZUKAJ.PIONOWO, jeśli na stałe wpisujesz A jako kolumnę nazwy. Po WYSZUKAJ.PIONOWO otrzymywałem #NA (nazwa nie została znaleziona) i # DIV0 (mianownik zero) i otoczyłem go = JEŻELI (JEŻELI (...)), aby wyświetlić w tych warunkach bardziej smaczny tekst. Teraz miałem potwornie duży wyraz twarzy, który był nieporęczny i niemożliwy do utrzymania. Chciałem więc rozwinięcia makra (nie istnieje) lub funkcji niestandardowych.
Ale kiedy zrobiłem pomocnika SubtractPrevValue (komórkę), otrzymywał „7” zamiast B5. Nie ma wbudowanego sposobu pobierania obiektów komórki lub zakresu z przekazanych argumentów.
Jeśli zmuszę użytkownika do ręcznego wprowadzenia nazwy komórki w cudzysłowie, mogę to zrobić ... SubtractPrevValue („B5”). Ale to naprawdę kopiowanie / wklejanie ścięgien ścięgnistych i względne funkcje komórek.
Ale potem znalazłem obejście.
SpreadsheetApp.getActiveRange () JEST KOMÓRKĄ zawierającą formułę. To wszystko, co naprawdę musiałem wiedzieć. Numer wiersza. Poniższa funkcja pobiera NUMERIC numer kolumny i odejmuje poprzednie wystąpienie w tej kolumnie.
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
}
Ale potem odkryłem, że to naprawdę NAPRAWDĘ powolne. Jedna i dwie sekundy opóźnień, gdy wyświetla się „Myślenie ...” Więc wracam do masowo nieczytelnej, niemożliwej do utrzymania formuły arkusza.