Як зберегти тимчасові змінні у формулі Google Sheets?


19

Я намагаюся створити формулу в електронній таблиці Google, яка виглядає приблизно так:

if (x < 0, x + 1, x)

Це означає, що якщо xменший за 0, повернути x + 1, то повернути x.

Однак xсам по собі є виразом, наприклад A1 + B1. Так я закінчив:

if ((A1 + B1) < 0, (A1 + B1) + 1, (A1 + B1))

Як я можу зберегти вираз (A1 + B1)у тимчасовій змінній x, щоб я могла це зробити? :

x = (A1 + B1);
if (x < 0, x + 1, x);

Поточний вираз у моїй таблиці виглядає приблизно так:

if(
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    < 0,
    1 +
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    ,
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
)

Я намагаюся зробити так, щоб він виглядав коротше і керованішим так:

x = timevalue(Sheet1!$D10) - timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))));
if(
    x
    < 0,
    1 +
    x
    ,
    x
)

1
@pnuts, Hmm, змінні є частиною формули формул. Злом клітинок як тимчасових змінних вважається брудним рішенням, оскільки клітини призначені для зберігання бізнес- даних, а не оперативної пам'яті.
Печер'є

1
@pnuts, Неважливо, де він зберігається, доки він не зберігається в клітинках. Осередки призначені для зберігання бізнес- даних.
Печер'є

1
@pnuts, рішення сценарію було б можливою наступною найкращою альтернативою. Поки дані не з’являються у комірці, це життєздатне рішення.
Pacerier

Відповіді:


6

Я часто в кінцевому підсумку використовую комірки як змінні для часто використовуваних обчислень, а фактично називаю їх за допомогою "названих діапазонів". Це полегшує думати про формулу, яку ви намагаєтеся розробити. Ви можете приховати ці клітинки, якщо не хочете, щоб їх бачили.


Це сприйме як вибране рішення, поки не з’явиться кращий.
Pacerier

4

Коротка відповідь

Наразі в Google Таблицях немає функції присвоювати ім’я змінній, визначеній формулою, а не посиланням на комірку чи діапазон. Для використання формули з цими видами змінних альтернативою є використання спеціальних функцій.

Спеціальні функції в Google Таблицях

Спеціальні функції визначені в проектах, пов’язаних зі сценаріями Google Apps або додатках Таблиць Google. Вони можуть використовуватися лише для повернення значень, а не для автоматизації таких завдань, як надсилання електронного листа.

Спеціальна функція схожа на функцію JavaScript, і вона може використовувати JSDOC для додавання вбудованих функцій, таких як автозаповнення та відображення помічника формули спливаючих вікон. Також може бути включено спеціальне повідомлення про помилку.

У випадку, представленому у запитанні, бажана структура формули, що відображається в комірці, повинна мати таку структуру

if(x < 0, 1 + x, x)

де xможе бути спеціальна функція.

Далі наведено простий приклад спеціальної функції, яка використовує JSDOC .

/**
* Returns the cell value of the specified row in column A of Sheet1.
* @param {number}   row_number   Input the row number.
* @return The cell value of the specified row in column A of Sheet1.       
* @customfunction
*/
function z(row_number) {
  if(typeof(row_number) != 'number') 
    throw new Error("A row number is required");
  return SpreadsheetApp
           .getActiveSheet()
           .getRange("Sheet1!A"+row_number)
           .getValue();
}

Формула, що використовує вищевказану користувацьку функцію зі структурою, визначеною у запитанні, виглядатиме наступним чином

=if(z(10) < 0, 1 + z(10), z(10))

row() може бути використаний замість константи, щоб мати як введення рядок, де розміщена формула.

Щоб "імітувати" явну формулу, подану у запитанні, вбудовані формули слід замінити функціями JavasScript / Google Apps Script.

Список літератури


Чи можна було б визначити власні функції за допомогою функцій Google Sheet (замість JS)? Я нічого не знайшов у цьому напрямку, тому сумніваюся.
зрозумів

@anderured: Наразі це неможливо. Дивіться stackoverflow.com/questions/3686061/…
Рубен

3

Я роблю деякі спроби з цього приводу (я згоден, це було б дуже корисною особливістю, особливо для довгих формул. Ось що я писав до цього часу:

//array to store variables
var variables = [];

//Wrap a formula with "D_VAR0()" for later use
function D_VAR0(formula) {
  variables.push(formula);
}

//Write "VAR0" to access the 0th element of variables[] (which could be a long formula)
function VAR0() {
  return variables[0];
}

Теоретично це було б корисно для спрощення складної формули клітини, наприклад:

=IF((A2+B2)/B3<16, (A2+B2)/B3, ((A2+B2)/B3)*45)

в це:

=IF(D_VAR0((A2+B2)/B3)<16, VAR0, VAR0*45)

Додатковий D_VAR#'sта VAR#'sможе бути записаний у сценарій, щоб забезпечити кілька оголошень змінної та дзвінків за потреби.

Однак видається, що D_VAR0обернена змінна не належним чином зберігає у масиві змінних [].

Якщо я вручну ввести елемент в масив, VAR0 може отримати доступ до нього та повернути його в активну комірку. Наприклад:

var variables = ["test"];

//results in the active cell being set to "test"
function VAR0() {
     return variables[0];
}

Це залишає у мене два питання. Якщо можливе наступне, я вважаю, що можна оголосити та викликати тимчасові змінні за допомогою спеціальної функції:

  1. Якщо користувацькі функції можуть отримати доступ до елементів масиву, чи можуть вони також зберігати елементи до масиву? Якщо так, то як?

  2. Якщо користувацькі функції можуть зберігати елементи в масиві, вони доступні лише в одній суміжній формулі в одній клітині? Або можливо отримати доступ до тієї самої збереженої змінної в іншій комірці? Приклад:

Cell A1 = D_VAR0(sum(3,5))

Cell D4 = VAR0() //would this return 8 in cell D4? It hasn't worked in my testing.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.