Как сохранить временные переменные в формуле 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, Хммм, переменные являются неотъемлемой частью формул. Взламывание ячеек как временных переменных кажется грязным решением, потому что ячейки предназначены для хранения бизнес- данных, а не оперативной памяти.
Pacerier

1
@pnuts, не имеет значения, где он хранится, если он не хранится в ячейках. Ячейки предназначены для хранения бизнес- данных.
Pacerier

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

Ответы:


6

Я часто заканчиваю тем, что использую ячейки в качестве переменных для часто используемых вычислений, и на самом деле называю их «именованными диапазонами». Это помогает думать о формуле, которую вы пытаетесь разработать. Вы можете скрыть эти клетки, если не хотите, чтобы их видели.


Приму это как выбранное решение, пока не появится лучшее.
Pacerier

4

Короткий ответ

В настоящее время в Google Sheets нет функции присвоения имени переменной, определяемой формулой, вместо ссылки на ячейку или диапазон. Чтобы использовать формулу с такими переменными, альтернативой является использование пользовательских функций.

Пользовательские функции в Google Sheets

Пользовательские функции определяются в связанных проектах Google Apps Scripts или в надстройках Google Sheets. Их можно использовать только для возврата значений, а не для автоматизации таких задач, как отправка электронного письма.

Пользовательская функция похожа на функцию 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)? Я ничего не нашел в этом направлении, поэтому сомневаюсь.
Понял

@anderstood: В настоящее время это невозможно. См. 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неправильно хранит перенесенную переменную в массиве variable [].

Если я вручную введу элемент в массив, 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.