假设我有三个单元格,一个包含距离,一个包含速度,另一个包含时间。现在我希望能够填充两个单元格(例如距离和速度)并在第三个单元格中计算时间。但是当我填写速度和时间时,应该计算距离。
如何在谷歌电子表格中实现这一目标?我想应该进行某种检查以不创建无限循环。我试图搜索细胞同步或细胞依赖性,但我认为这不是解决这个问题的正确术语。
答案 0 :(得分:3)
您可以使用嵌套的if语句执行此操作:
=if(And(isnumber(A2),isnumber(C2)),ROUND(A2/C2),if(And(isnumber(A2),isnumber(B2)),round(A2/B2),if(and(isnumber(B2),isnumber(C2)),B2*TIMEVALUE(C2)*24,)))
以下是所有三种情况的屏幕截图:
答案 1 :(得分:1)
您可以使用function onEdit(t) {
var workSheetName = 'Sheet1'; // change sheet name to yours
var distanceRangeAddress = 'A2:A'; // change if needed
var speedRangeAddress = 'B2:B'; // change if needed
var timeRangeAddress = 'C2:C'; // change if needed
var ss = SpreadsheetApp.getActiveSheet();
var sn = ss.getName();
var distance, speed, time;
if (sn == workSheetName) {
var tr = t.range;
if (t.oldValue != tr.getValue() && tr.getNumColumns() == 1 && tr.getNumRows() == 1) {
// distance
var myr = ss.getRange(distanceRangeAddress);
if (RangeIntersect(tr, myr)) {
distance = tr.getValue();
speed = tr.offset(0, 1).getValue();
time = tr.offset(0, 2).getValue();
if (time > 0) {
speed = distance / time;
tr.offset(0, 1).setValue(time);
return;
}
if (speed > 0) {
time = distance / speed;
tr.offset(0, 2).setValue(time);
return;
}
}
// speed
myr = ss.getRange(speedRangeAddress);
if (RangeIntersect(tr, myr)) {
speed = tr.getValue();
distance = tr.offset(0, -1).getValue();
time = tr.offset(0, 1).getValue();
if (time > 0) {
distance = speed * time;
tr.offset(0, -1).setValue(distance);
return;
}
if (distance > 0) {
time = distance / speed;
tr.offset(0, 1).setValue(time);
return;
}
}
// time
myr = ss.getRange(timeRangeAddress);
if (RangeIntersect(tr, myr)) {
time = tr.getValue();
distance = tr.offset(0, -2).getValue();
speed = tr.offset(0, -1).getValue();
if (speed > 0) {
distance = speed * time;
tr.offset(0, -2).setValue(distance);
return;
}
if (distance > 0) {
speed = distance / time;
tr.offset(0, -1).setValue(speed);
return;
}
}
}
}
}
function RangeIntersect(R1, R2) {
var LR1 = R1.getLastRow();
var Ro2 = R2.getRow();
if (LR1 < Ro2) return false;
var LR2 = R2.getLastRow();
var Ro1 = R1.getRow();
if (LR2 < Ro1) return false;
var LC1 = R1.getLastColumn();
var C2 = R2.getColumn();
if (LC1 < C2) return false;
var LC2 = R2.getLastColumn();
var C1 = R1.getColumn();
if (LC2 < C1) return false;
return true;
}
事件:
脚本的全文在这里:
var workSheetName = 'Sheet1'; // change sheet name to yours
var distanceRangeAddress = 'A2:A'; // change if needed
var speedRangeAddress = 'B2:B'; // change if needed
var timeRangeAddress = 'C2:C'; // change if needed
&#13;
您可能想要在脚本的开头更改参数:
{{1}}
此处example file。
该脚本可以根据您的需求进行改进和采用。请在这里查找more information。