Javascript 如何在谷歌电子表格的谷歌应用程序脚本中判断两个单元格是否相等
我正在编写一个脚本来绑定两个单元格,以便在每次编辑后始终保持相同的值。到目前为止,我的脚本如下所示:Javascript 如何在谷歌电子表格的谷歌应用程序脚本中判断两个单元格是否相等,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我正在编写一个脚本来绑定两个单元格,以便在每次编辑后始终保持相同的值。到目前为止,我的脚本如下所示: function myEdit(event){ var ss = event.source.getActiveSheet(); var r = event.source.getActiveRange(); var bind1 = ss.getRange("D11:D11").getCell(1,1); var bind2 = ss.getRange("D10:D10").getC
function myEdit(event){
var ss = event.source.getActiveSheet();
var r = event.source.getActiveRange();
var bind1 = ss.getRange("D11:D11").getCell(1,1);
var bind2 = ss.getRange("D10:D10").getCell(1,1);
var editedCell = r.getCell(1,1);
Logger.log("checking");
if (editedCell === bind1){
Logger.log("Condition was Met!");
bind1.copyTo(bind2);
}
else if (editedCell === bind2){
Logger.log("Condition was met!");
bind2.copyTo(bind1);
}
else{
Logger.log("No condition was met.");
}
function myEdit(event){
// To check whether we need to do anything, find which cell was edited.
// Get the A1 notation for the changed cell.
var cellA1 = event.range.getA1Notation();
if (cellA1 == "D10") {
// D10 changed, so copy value to D11
event.range.offset(1,0).setValue(event.value);
}
else if (CellA1 == "D11") {
// D11 changed, so copy value to D10
event.range.offset(-1,0).setValue(event.value);
}
// Any other cell, do nothing.
}
当我更改任一绑定单元格中的值时,不会将任何内容复制到其他任何位置。当我检查执行日志时,似乎一切正常
[14-07-21 10:47:06:215 EDT] Execution succeeded [0.884 seconds total runtime]
但是当我检查日志记录时,我得到
[14-07-21 10:55:49:260 EDT] checking
[14-07-21 10:55:49:260 EDT] No condition was met.
由于某些原因,当我编辑单元格D11时,程序无法识别editedCell和bind1是同一个对象
通过检查bind1和editedCell的值,这些值是相同的,因此它们必须引用相同的单元格,但相等运算符不检查它们是否在相同的范围内
由于某些原因,当我编辑单元格D11时,程序无法识别editedCell和bind1是同一个对象
在这种情况下,标识运算符==
不起作用的原因是,要比较的是范围,而不是这些范围中单元格的内容。就像桑迪建议的那样,你需要先得到这些值,然后进行比较
然而,不需要比较,是吗?您声明的目标是确保D10和D11在每次编辑后包含相同的值。由于唯一可以影响其中一个单元格的编辑是对其自身的更改,因此可以忽略对除D10或D11以外的任何单元格所做的任何编辑。此外,如果其中一个发生更改,并且调用了myEdit()
,则您知道它们是不同的,因此您可以将新更改的值复制到另一个单元格中
大概是这样的:
function myEdit(event){
var ss = event.source.getActiveSheet();
var r = event.source.getActiveRange();
var bind1 = ss.getRange("D11:D11").getCell(1,1);
var bind2 = ss.getRange("D10:D10").getCell(1,1);
var editedCell = r.getCell(1,1);
Logger.log("checking");
if (editedCell === bind1){
Logger.log("Condition was Met!");
bind1.copyTo(bind2);
}
else if (editedCell === bind2){
Logger.log("Condition was met!");
bind2.copyTo(bind1);
}
else{
Logger.log("No condition was met.");
}
function myEdit(event){
// To check whether we need to do anything, find which cell was edited.
// Get the A1 notation for the changed cell.
var cellA1 = event.range.getA1Notation();
if (cellA1 == "D10") {
// D10 changed, so copy value to D11
event.range.offset(1,0).setValue(event.value);
}
else if (CellA1 == "D11") {
// D11 changed, so copy value to D10
event.range.offset(-1,0).setValue(event.value);
}
// Any other cell, do nothing.
}
所有
执行成功
意味着代码运行时没有任何错误。这并不意味着它做了你想让它做的事。为所有变量输入Logger.log()
语句,或者运行Debug,逐行检查每一行代码,并在Debug窗口中查看变量值。是的!我提到执行成功只是为了让人们知道没有任何“执行失败”之类的错误。Logger.log(editedCell)只是打印出单词“范围”。如果输入Logger.log(editedCell.getValue()),它将打印出所需单元格的值。此外,(editedCell.getValue()==bind1.getValue())的计算结果为true,但(editedCell==bind1)的计算结果为false。Range是类范围的返回类型。我认为还有一步。然后需要在类范围上使用getValue()
方法var editedCell=r.getCell(1,1).getValue()
Basic javascript:(editedCell==bind2)
仅当editedCell
和bind2
是完全相同的对象时才会计算true
。它不比较这些对象的属性。我不想比较对象的值。我希望它们是同一个物体。不管是从event.source.getActiveRange()还是event.source.getActiveSheet.getRange(“D10:D10”)获取,单元格D10都应该是单元格D10。我无法基于值检查它们是否相同,因为许多未绑定的单元格也可能具有相同的值,我不希望基于该逻辑进行绑定。