Fluidtable — это современное приложение для работы с электронными таблицами. Вместо того, чтобы просто копировать функции Excel, цель состоит в том, чтобы подумать о проблеме, которую они пытаются решить, и найти лучшее решение.
Это означает, что вам придется научиться делать что-то по-новому. Но не волнуйтесь. Может по другому, но не сложно. И я лично стремлюсь делать это все проще и проще.
Пожалуйста, прокомментируйте то, что недостаточно ясно или слишком сложно. Я отдам им приоритет.

Примечание 1

В Excel столбцы обозначаются буквами. При этом на строки ссылаются по номерам, начинающимся с 1.
В Fluidtable и на строки, и на столбцы ссылаются по номерам, начинающимся с 0.

Заметка 2

В Fluidtable вы можете добавить формулы/код, выбрав ячейку и нажав кнопку Add Code. В противном случае вы можете писать прямо в выбранную ячейку, добавляя к коду префикс =js.

Оглавление

Арифметические операции

Арифметические операции такие же, но вы должны добавить к ним префикс ключевого слова return.

// Excel
=123 * 2
=(3 * 2) / (1 + 2)
// Fluidtable
return 123 * 2
return (3 * 2) / (1 + 2)

Получить значения

Получить значение ячейки

Получить значение из любой таблицы в текущем документе.

// Excel
=B3
=Sheet1!B5
=A1 + C2
// Fluidtable
// Use Table.value(rowIndex, columnIndex, tableName)
return Table.value(2, 2)
return Table.value(4, 1, "Sheet1")
return Table.value(0, 0) + Table.value(1, 3)

Получить значения строки

Получить строку значений из любой таблицы в текущем документе.

// Excel
=2:2
=Sheet1!5:5
// Fluidtable
// Use Table.row(rowIndex, tableName)
return Table.row(2)
return Table.row(5, "Sheet1")

Получить значения столбца

Получить столбец значений из любой таблицы в текущем документе.

// Excel
=B:B
=Sheet1!C:C
// Fluidtable
// Use Table.column(columnIndex, tableName)
return Table.column(1)
return Table.column(2, "Sheet1")

Получить диапазон значений

Получите двумерный диапазон значений (также известный как матрица) из любой таблицы в текущем документе.

// Excel
=B1:C1
=B1:B3
=A1:C3
=Sheet1!A1:B2
// Fluidtable
// Use Table.range(startRow, startColumn, endRow, endColumn, tableName)
return Table.range(0, 1, 0, 2)
return Table.range(0, 1, 2, 1)
return Table.range(0, 0, 2, 2)
return Table.range(0, 0, 1, 1, "Sheet1")

Получить текущую информацию о ячейке

Получить текущую строку ячейки, столбец и имя таблицы.

// Excel
=ADDRESS(ROW(), COLUMN()) // -> $B$4
// Fluidtable
// Use Table.currentCellInfo()
return Table.currentCellInfo() // -> { row: 3, column: 1, tableName: "Table 1" }
return Table.currentCellInfo().row // -> 3
return Table.currentCellInfo().column // -> 1
return Table.currentCellInfo().tableName // -> Table 1

Суммарные значения

Суммируйте диапазон значений. Нечисловые значения будут автоматически отфильтрованы.

// Excel
=SUM(1, 2, 3)
=SUM(A1, B1)
=SUM(A1:B5)
// Fluidtable
// Use Values.sum(valuesRange)
return Values.sum([1, 2, 3])
const values = [1, 2, 3]; return Values.sum(values)
return Values.sum(Table.column(2))
return Values.sum(Table.row(1))

Сумма значений ЕСЛИ соответствует условию

Суммируйте ряд значений, если они соответствуют заданному условию.

// Excel
=SUMIF(A1:C1, "<1") // Sum values smaller than 1
// Fluidtable
// Use Values.sumIf(valuesRange, conditionFunction)
// Sum only the even numbers
return Values.sumIf([1, 2, 3], val => val %2 === 0) // -> 2
// Sum row 0 values smaller than 1
return Values.sumIf(Table.row(0), val => val < 1)

Подсчет значений

Подсчитайте значения в диапазоне.

// Excel
=COUNTA("ciao", null, 3) // -> 3
=COUNTA(A1:A5) + COUNTBLANK(A1:A5) // -> 5
=COUNTA(A1:B3) + COUNTBLANK(A1:B3) // -> 6
// Fluidtable
// Use Values.count(valuesRange)
return Values.count(["ciao", null, 3]) // -> 3
const values = ["ciao", null, 3]; return Values.count(values); // -> 3
return Values.count(Table.row(2))
return Values.count(Table.column(1))
return Values.count(Table.range(0, 0, 0, 4)) // -> 5
return Values.count(Table.range(0, 0, 2, 2)) // -> 9

Подсчет непустых значений

Подсчитайте непустые значения в диапазоне.

// Excel
=COUNTA("ciao", null, 3) // -> 1
=COUNTA(A1:A5)
// Fluidtable
// Use Values.countNonEmpty(valuesRange)
return Values.countNonEmpty(["ciao", null, 3]) // -> 2
const values = ["ciao", null, 3]; return Values.countNonEmpty(values); // -> 2
return Values.countNonEmpty(Table.column(2))
return Values.countNonEmpty(Table.row(2))
return Values.countNonEmpty(Table.range(0, 0, 2, 2))

Подсчет числовых значений

Подсчитайте числовые значения в диапазоне.

// Excel
=COUNT("ciao", null, 3) // -> 1
=COUNT(A1:A5)
// Fluidtable
// Use Values.countNumbers(valuesRange)
return Values.countNumbers(["ciao", null, 3]) // -> 1
const values = ["ciao", null, 3]; return Values.countNumbers(values); // -> 1
return Values.countNumbers(Table.column(2))
return Values.countNumbers(Table.row(2))
return Values.countNumbers(Table.range(0, 0, 2, 2))

Считать, если выполняется условие

Подсчитайте значения в диапазоне, которые соответствуют заданному условию.

// Excel
=COUNTIF(A1:C1, ">10") // Count values bigger than 10
=COUNTIF(A1:C3, "b*") // Count values starting with letter b
// Fluidtable
// Use Values.countIf(valuesRange, conditionFunction)
// Count values bigger than 10
return Values.countIf(Table.row(0), val => val > 10)
// Count values starting with letter b
return Values.countIf(Table.row(0), val => val.substring(0, 1) === "b")
// Count values of type string
const condition = (val) => { typeof val === ‘string’ }; return Values.countIf(Table.row(0), condition)

Средний

Вычислить среднее значение диапазона числовых значений. Пустые и нечисловые значения автоматически отфильтровываются.

// Excel
=AVERAGE(2, 4, 6) // -> 4
=AVERAGE(A1:A3)
// Fluidtable
return Values.average([2, 4, 6]) // -> 4
const values = [2, 4, 6]; return Values.average(values) // -> 4
return Values.average(Table.column(2))
return Values.average(Table.range(0, 0, 2, 2))

Среднее значение IF соответствует условию

Вычислить среднее значение диапазона числовых значений, если они соответствуют условию. Пустые и нечисловые значения автоматически отфильтровываются.

// Excel
=AVERAGEIF(A1:A3, ">2")
=AVERAGEIF(B1:B5, "<1")
// Fluidtable
// Use Values.averageIf(valuesRange, conditionFunction)
return Values.averageIf([2, 4, 6,], val => val > 2) // -> 5
// Average of the number who are between 10 and 100
return Values.averageIf(Table.row(0), val => val > 10 && val < 100)

Существует ли значение?

Проверьте, существует ли значение в диапазоне значений.

// Excel
=COUNTIF($A$2:$A2, $A2) > 0 // True if exist, false otherwise
// Fluidtable
// Use Values.exists(searchValue, valuesArray)
return Values.exists("Mia", ["Joe", "Ann", "Mia"]) // -> true
return Values.exists(Table.value(0, 0), Table.column(2))
return Values.exists(Table.value(0, 0), Table.row(2))

Индекс значения

Найдите индекс данного значения в диапазоне значений.

// Excel
=MATCH("Alex", A2:A5, 0) // -> Index of row with value Alex
// Fluidtable
// Use Values.indexOf(searchValue, valuesArray)
return Values.indexOf("Alex", ["Ann", "Alex", "Joe"]) // -> 1
return Values.indexOf(Table.value(0, 0), Table.column(2))
return Values.indexOf(Table.value(0, 0), Table.row(2))

Является ли значение дубликатом?

Проверить, является ли заданное значение дубликатом

// Excel
=COUNTIF($A$2:$A2, $A2) > 1 // True if duplicate, false otherwise
=IF(COUNTIF($A$2:$A2, $A2) > 1, "Duplicate", "Unique")
// Fluidtable
// Use Values.isDuplicate(searchValue, values)
return Values.isDuplicate("Johnny", ["Ann", "Johnny", "Joe", "Johnny"]) // -> true
return Values.isDuplicate(Table.value(0, 0), Table.column(0))
return Values.isDuplicate(Table.value(1, 3), Table.row(1))

Получить индексы повторяющихся значений

Получить массив индексов значений дубликатов.

// Excel
// Repeat for each row
=COUNTIF($A$2:$A2, $A2) > 1
// Fluidtable
// Use Values.duplicatesIndexes(values)
return Values.duplicatesIndexes(["Ann", "Johnny", "Joe", "Johnny", "Ann"]) // -> [3, 4]
return Values.duplicatesIndexes(Table.column(0))
return Values.duplicatesIndexes(Table.row(3))

Уникальные значения

Получить уникальный список значений из другого списка.

// Excel
=INDEX(list, MATCH(0, COUNTIF($D$4:D4, list), 0))
// Fluidtable
// Use Values.uniques(inputValues)
return Values.uniques(["Ann", "Johnny", "Joe", "Johnny", "Ann"]) // -> ["Ann", "Johnny", "Joe"]
return Values.uniques(Table.column(1))
return Values.uniques(Table.row(3))

Максимальное значение

Получить наибольшее значение в диапазоне значений.

// Excel
=MAX(2, 4, 6) // -> 6
=MAX(A1, A2, A3)
// Fluidtable
// Use Values.max(valuesArray)
return Values.max([2, 4, 6]) // -> 6
return Values.max(Table.column(1))
return Values.max(Table.row(3))

Минимальное значение

Получите наименьшее значение в диапазоне значений.

// Excel
=MIN(2, 4, 6) // -> 2
=MIN(A1, A2, A3)
// Fluidtable
// Use Values.min(valuesArray)
return Values.min([2, 4, 6]) // -> 2
return Values.min(Table.column(1))
return Values.min(Table.row(3))

Округлить число

Округлить число до заданного количества знаков после запятой.

// Excel
=ROUND(1.1234, 2) // -> 1.12
=ROUND(1.1234, 0) // -> 1
=ROUND(A1, 1)
// Fluidtable
// Use Values.round(value, decimalsCount)
return Values.round(1.1234, 2) // -> 1.12
return Values.round(1.1234, 0) // -> 1
return Values.round(Table.value(0, 2), 1)

Делайте слова заглавными

Сделать заглавной первую букву всех слов в тексте

// Excel
=PROPER("johnny machete") // -> Johnny Machete
=PROPER(A2)
// Fluidtable
// Use Values.capitalizeWords(string)
return Values.capitalizeWords("boe machete") // -> Boe Machete
return Values.capitalizeWords(Table.value(1, 2))

оператор ЕСЛИ

Возвращает значение в зависимости от результата данного условия.

// Excel
=IF(8 > 6, "Passed", "Failed")
=IF(C3 > D3, "Passed", "Failed")
=IF(B2 > 1000, "Goal reached", "Goal missed")
// Fluidtable
// Use Javascript’s if statements short syntax
return Table.value(0, 0) > Table.value(2, 3) ? "Yes" : No"
return Table.value(1, 2) > 1000 ? "Goal reached" : "Goal missed"
// Use Javascript’s if statements standard syntax
if (Table.value(1, 2) > 1000) {
  return "Goal reached";
} else {
  return "Goal missed";
}

Вложенные операторы ЕСЛИ

Возвращает значение в зависимости от результата нескольких заданных условий. Существует несколько синтаксисов, которые вы можете использовать. Выберите тот, который вам нравится больше всего. Все они правильные.

// Excel
=IF(C3 > D3, IF(A3 > 100, "Passed++", "Passed"), "Failed")
// Fluidtable
// Syntax A
if (Table.value(1, 2) > Table.value(3, 2)) {
  if (Table.value(2, 0) > 100) {
    return "Passed++";
  } else {
    return "Passed";
  }
} else {
  return "Failed";
}
// Syntax B
if (Table.value(1,2)>Table.value(3,2) && Table.value(2,0)>100) {
  return "Passed++";
} else if (Table.value(1, 2) > Table.value(3, 2)) {
  return "Passed";
} else {
  return "Failed";
}
// Syntax C
return Table.value(1, 2) > Table.value(3, 2)
 ? Table.value(1, 2) > Table.value(3, 2) ? "Passed++" : "Passed"
 : "Failed"

Индекс/совпадение

Найдите индекс заданного значения, а затем верните другое значение в том же столбце или строке.

// Excel
=MATCH("Alex", A2:A5, 0) // -> Index of row with value Alex
=INDEX(C2:C5, 3) // -> 3rd value in range C2:C5
=INDEX(C2:C5, MATCH("Alex", A2:A5, 0)) // -> 3rd value in C2:C5
// Fluidtable
// Use Values.indexOf(searchValue, valuesArray)
// in combination with Table.value(rowIndex, columnIndex, tableName)
return Table.value(Values.indexOf("Anna, Table.column(1)), 2)
return Table.value(2, Values.indexOf(100, Table.row(0)))
const searchRowIndex = Values.indexOf("Anna", Table.column(1));
if (searchRowIndex === null) { return "Value not found"; }
return Table.value(searchRowIndex, 2);
const searchColumnIndex = Values.indexOf(100, Table.row(1));
if (searchColumnIndex === null) { return "Value not found"; }
return Table.value(2, searchColumnIndex);

ВПР

Найдите значение в заданном столбце, а затем верните другое значение в той же строке. Решение такое же, как и для index/match.

// Excel
=VLOOKUP(B18, $A$1:$B$13, 2, FALSE)
// Fluidtable
// Use Values.indexOf(searchValue, valuesArray)
// in combination with Table.value(rowIndex, columnIndex, tableName)
const searchRowIndex = Values.indexOf("Anna", Table.column(1));
if (searchRowIndex === null) { return "Value not found"; }
return Table.value(searchRowIndex, 2);

Hlookup

Найдите значение в заданной строке, затем верните другое значение в том же столбце. Решение такое же, как и для index/match.

// Excel
=HLOOKUP(B18, $A$1:$F$2, 2, FALSE)
// Fluidtable
// Use Values.indexOf(searchValue, valuesArray)
// in combination with Table.value(rowIndex, columnIndex, tableName)
const searchColumnIndex = Values.indexOf(100, Table.row(1));
if (searchColumnIndex === null) { return "Value not found"; }
return Table.value(2, searchColumnIndex);

Объединить несколько значений

Объединение двух или более значений в одно.

// Excel
=CONCATENATE("Name: ", A1, " ", B1) // -> Name: Johnny Machete
// Fluidtable
// Use Javascript standard string concatenation
return "Name: "+ Table.value(0, 0) + " " + Table.value(0, 1)
const row = Table.row(0); return "Name: "+ row[0] +" "+ row[1]
// Use Javascript standard string template
return `Name: ${Table.value(0, 0)} ${Table.value(0, 1)}`
const row = Table.row(0); return `Name: ${row[0]} ${row[1]}`

Длина строки

Получить длину строкового значения.

// Excel
=LEN(A1)
// Fluidtable
return Table.value(0, 0).length
const value = Table.value(0, 0); return value.length

Обрезать строку

Удалите пробелы в начале и в конце строки.

// Excel
=TRIM(A1)
// Fluidtable
return Table.value(0, 0).trim()
const value = Table.value(0, 0); return value.trim()

ИЛИ: Соблюдено ли какое-либо условие?

Проверьте, верно ли какое-либо из условий.

// Excel
// True if A1 is bigger than A2 or B1 is bigger than 100
=OR(A1 > A2, B1 > 100)
// Fluidtable
// Use Javascript standard || operator (double pipe)
return valueOne || valueTwo
return Table.value(0, 0) || Table.value(0, 3)
return Table.value(0, 0) > Table.value(0, 1) || Table.value(0,3)

И: Все ли условия соблюдены?

Проверьте, все ли условия верны.

// Excel
// True if A1 is bigger than A2 and B1 is bigger than 100
=AND(A1 > A2, B1 > 100)
// Fluidtable
// Use Javascript standard && operator (double commercial e)
return valueOne && valueTwo
return Table.value(0, 0) && Table.value(0, 3)
return Table.value(0, 0) > Table.value(0, 1) && Table.value(0,3)

Еще не все

Пожалуйста, сообщите нам, какие формулы вы хотели бы внедрить в Fluidtable и добавить в этот список. Оставьте комментарий или спросите в Обществе.