Этот скрипт будет делать то же самое (плюс немного больше).
Код
function myInterpolation(x, y, value) {
if(value > Math.max.apply(Math, x) || value < Math.min.apply(Math, x)) {
throw "value can't be interpolated !!";
return;
}
var check = 0, index;
for(var i = 0, iLen = x.length; i < iLen; i++) {
if(x[i][0] == value) {
return y[i][0];
} else {
if(x[i][0] < value && ((x[i][0] - check) < (value - check))) {
check = x[i][0];
index = i;
}
}
}
var xValue, yValue, xDiff, yDiff, xInt;
yValue = y[index][0];
xDiff = x[index+1][0] - check;
yDiff = y[index+1][0] - yValue;
xInt = value - check;
return (xInt * (yDiff / xDiff)) + yValue;
}
Разъяснения
В начале скрипта есть небольшая обработка ошибок. После этого он найдет первую наименьшую запись по сравнению с входным значением. После того, как он найден, он немного подсчитает и представит результат.
Запись
Если выбранное значение равно 20, сценарий возвращает 150 в соответствии с формулой #DIV/0
.
Скриншот
формула
Используйте следующую формулу, чтобы учесть все значения
=IF(
ISNA(
MATCH(C2,A2:A7,0)),
FORECAST(
$C$2,
OFFSET(B$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1),
OFFSET(A$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1)),
INDEX(
B2:B7,
MATCH(C2,A2:A7,0)
,0)
)
copy / paste
=IF(ISNA(MATCH(C2, A2:A7, 0)), FORECAST($C$2,OFFSET(B$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1),OFFSET(A$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1)), INDEX(B2:B7, MATCH(C2, A2:A7, 0), 0))
пример
Добавьте скрипт в Сервис> Редактор скриптов и нажмите кнопку сохранения (аутентификация не требуется).
Я создал для вас файл примера: как интерполировать данные в диапазоне в Google Sheets
Я нашел способ сделать это - может быть, есть лучший способ, но вот что я придумал:
Предполагая, что данные находятся в A1: B10 и $ C $ 1 содержит ключ для поиска:
В деталях:
ПРОГНОЗ делает линейную интерполяцию, но предполагает прямую линию. Таким образом, нам нужно найти два значения, которые содержат значение, которое мы ищем.
Поэтому мы используем MATCH, чтобы найти первое число, которое равно или больше того, что мы ищем.
FORECAST ожидает диапазон данных, поэтому мы используем OFFSET для создания ссылки на диапазон данных. MATCH с одним индексом, поэтому сначала нужно вычесть один. Мы создаем диапазон, один широкий и два высоких. Это значение гарантированно вмещает $ C $ 1, значение нашего поиска.
источник
x=20
приведет к#DIV/0
.Это небольшая модификация сценария Джейкоба Яна Туинстры , позволяющая ему принимать массив или значение в качестве третьего аргумента, так что интерполированная функция может быть вычислена во многих местах одновременно. Единственная разница - несколько строк, добавленных в начале; это быстрый способ превратить практически любую пользовательскую функцию в пользовательскую функцию, которая принимает массив.
источник