Цей сценарій зробить те саме (плюс ще трохи).
Код
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 Таблицях