2014-07-21 2 views
0

Я пишу скрипт для привязки двух ячеек, которые всегда сохраняют одно и то же значение после каждого редактирования. Мой сценарий до сих пор выглядит следующим образом:Как определить, равны ли две ячейки в скрипте Google Apps для Google Spreadsheet

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."); 
    } 

При изменении значения в любой из связанных ячеек, ничего не копируется нигде. Когда я проверяю журналы выполнения, оказывается все прошло хорошо

[14-07-21 10:47:06:215 EDT] Execution succeeded [0.884 seconds total runtime] 

Но когда я проверяю журналы Logger, я получаю

[14-07-21 10:55:49:260 EDT] checking 
[14-07-21 10:55:49:260 EDT] No condition was met. 

По какой-то причине программа не признается, что editedCell и bind1 являются тот же объект, когда я редактирую ячейку D11.

Проверяя значения bind1 и editCell, значения одинаковы, поэтому они должны ссылаться на одну и ту же ячейку, но оператор равенства не работает, чтобы проверить, являются ли они одним и тем же диапазоном.

+0

Все 'Исполнение succeeded' означает, что код работал без каких-либо ошибок. Это не значит, что он сделал то, что хотел. Поместите оператор 'Logger.log()' для всех ваших переменных или запустите Debug, пройдите через каждую строку кода и просмотрите значения переменных в окне отладки. –

+0

Yup! Я упомянул, что выполнение выполнено именно так, чтобы люди знали, что ошибок «не удалось выполнить» и т. П. Не было. Logger.log (отредактированныйКелл) просто распечатывает слово «Диапазон». Если I Logger.log (отредактированCell.getValue()), он выдает значение требуемой ячейки. Кроме того, (editCell.getValue() === bind1.getValue()) оценивает значение true, но (отредактированоCell === bind1) оценивается как false. – johncorser

+0

Диапазон - это возвращаемый тип класса Range. [Диапазон классов] (https://developers.google.com/apps-script/reference/spreadsheet/range#) Я думаю, что есть еще один шаг. Затем вам нужно использовать метод getValue() 'для класса Range. 'var editCell = r.getCell (1,1) .getValue()' –

ответ

0

По какой-то причине программа не распознает, что editCell и bind1 являются одним и тем же объектом, когда я редактирую ячейку D11.

Причина, по которой личности оператор === не работает в данном случае является то, что сравнивают это диапазон, а не содержание клеток в этих диапазонах. Как говорит Сэнди, вам нужно сначала получить значения и сравнить их.

Однако сравнение не нужно, не так ли? Ваша заявленная цель - обеспечить, чтобы D10 и D11 имели одинаковое значение после каждого редактирования. Поскольку единственное редактирование, которое может повлиять на это, - это изменение для себя, вы можете игнорировать любое редактирование, сделанное для любых ячеек, но D10 или D11. Кроме того, если какой-либо из них изменяется, и вызывается myEdit(), вы знаете, они разные, поэтому вы можете просто скопировать вновь измененное значение в другую ячейку.

Что-то вроде этого:

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. 
} 
Смежные вопросы