Kịch bản này sẽ làm tương tự (cộng thêm một chút nữa).
Mã
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;
}
Giải thích
Trong phần đầu của tập lệnh, có một lỗi xử lý nhỏ. Sau đó, nó sẽ tìm mục nhập thấp nhất đầu tiên so với giá trị đầu vào. Sau khi tìm thấy, nó sẽ làm một số phép toán và trình bày kết quả.
Ghi chú
Nếu giá trị được chọn bằng 20, tập lệnh trả về 150 khi công thức mang lại #DIV/0
.
Ảnh chụp màn hình
Công thức
Sử dụng công thức sau để tính đến tất cả các giá trị
=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))
Thí dụ
Thêm tập lệnh trong Công cụ> Trình chỉnh sửa tập lệnh và nhấn nút lưu (không cần xác thực).
Tôi đã tạo một tệp ví dụ cho bạn: Cách nội suy dữ liệu trong một phạm vi trong Google Sheets