удалить скрипт приложения Google для настраиваемого поля

Я пытаюсь удалить настраиваемое поле на основе его значения, но оно умирает при тестировании. Текущий код:

function testDelete2() {
  var contacts = ContactsApp.findContactGroup('test').getContacts();    

    for (var i in contacts) {

    var checkfield = contacts[i].getUserDefinedField('testlabel')

        if (checkfield == 'testvalue') {

          var customFields = contacts[i].getCustomFields();
          customFields.deleteCustomField('testlabel');
        }
    }
}

Я получаю эту ошибку: TypeError: не удается найти функцию deleteCustomField в объекте CustomField.

Понятия не имею, что это значит. Пожалуйста помоги. Я читал эту страницу снова и снова, и это не помогло: https://developers.google.com/apps-script/service_contacts

Я даже попробовал этот вариант, который не сработал:

      customFields.getLabel('testlabel').deleteCustomField();

Кроме того, есть ли где-нибудь простая документация с примерами того, как работать с настраиваемыми полями контактов Google? Добавление, удаление, получение значения - все это кажется невозможным. Я ценю помощь с этим вопросом, но также не против найти где-нибудь руководство с простыми образцами, на которые можно посмотреть.

Вдохновляясь отличным кодом Сержа, я придумал этот код для удаления (скоро добавлю полный код с удалением / добавлением):

ОБНОВЛЕНИЕ: упрощенный процесс (не знаю, почему не попробовал это вначале, возможно, я это сделал, но в любом случае кодировал неправильно), вынув пользовательское поле удаления / добавления и просто обновив значение этого настраиваемого поля

function testUpdateDues() {

var duescos = ContactsApp.findContactGroup('z8 - Assoc').getContacts();   

for (var i in duescos) {

var customFields = duescos[i].getCustomFields();

for (var n in customFields) {

if (customFields[n].getLabel() == 'Dues Amount' && customFields[n].getValue() == 'unstated'){
customFields[n].setValue('$ 500');
}
}
}
}

Окончательное редактирование позволяет мне добавлять / редактировать любое настраиваемое поле на основе назначения группы контактов Google (спасибо, Серж за помощь !!) с помощью триггеров на основе времени в скрипте:

function UpdateRegion1() {
  UpdateCustomField('Reg 1 - Pan', 'Region' , 'Region 1 - Panhandle');
}

    function UpdateCustomField(group, customlabel, customvalue) {
  var contacts = ContactsApp.findContactGroup(group).getContacts();
  for (var i in contacts) {
    var fields = new Array();
    var customFields = contacts[i].getCustomFields(); 
    for(var n in customFields) {
      fields.push(customFields[n].getLabel());
    }
    if (fields.indexOf(customlabel)==-1){
      contacts[i].addCustomField(customlabel, customvalue);
    }
    for(var j in customFields) {
      if (customFields[j].getLabel() == customlabel && customFields[j].getValue() != customvalue){
        customFields[j].setValue(customvalue);
      }
    }
  }
}

person user1783229    schedule 01.11.2012    source источник
comment
зачем вы добавили Utilities.sleep(4000)? без него пробовали?   -  person Serge insas    schedule 02.11.2012
comment
да, я получил эту ошибку etag, когда контакт редактируется слишком быстро - поскольку поле удаляется, затем добавляется еще одно в один контакт, я добавил его, чтобы можно было удалить. каждый скрипт, в котором я редактировал один контакт с последовательными действиями, отправлял мне ошибку etag, если я не включил 4-секундную задержку - ненавижу это делать, так как это замедляет его, но я искал и искал, и, похоже, единственное решение, которое работает   -  person user1783229    schedule 02.11.2012
comment
fyi - я бы проголосовал за ваш ответ на плюс один, но система все равно не позволяет мне, так как я новичок   -  person user1783229    schedule 02.11.2012


Ответы (1)


Вот как это работает, см. Комментарии в коде

function testDelete2() {
  var contacts = ContactsApp.findContactGroup('test').getContacts();    

    for (var i in contacts) {

      var customFields = contacts[i].getCustomFields();// returns an array of custom fields

        for(var n in customFields) { // iterate the custom fields

Logger.log(customFields[n].getLabel()+' = '+customFields[n].getValue()) // EDIT : just changed this line to show the label AND the value

          if(customFields[n].getLabel() == 'testlabel'){ // compare the label with your criteria

          customFields[n].deleteCustomField();// if true then delete
      }
    }
  }
}

Я надеюсь, что это также (в некотором роде) ответ на ваш второй запрос ... Как видите, все дело в правильном использовании этих функций. Я бы посоветовал вам использовать регистратор, который вам поможет. Это позволяет увидеть, какой тип возвращаемой переменной ... (только между вами и мной, вот как я «отлаживал» ваш код .... но, пожалуйста, сохраните это в секрете ;-)

Я видел в вашем профиле, что вы «используете скрипт приложений Google, потому что я должен», но я уверен (надеюсь), что в конце концов вам это понравится.

РЕДАКТИРОВАТЬ 2: сценарий для добавления настраиваемого поля, если оно отсутствует.

function addCustomField() {
  var contacts = ContactsApp.findContactGroup('Insas').getContacts();    

    for (var i in contacts) {
var fields = new Array()
      var customFields = contacts[i].getCustomFields()
        for(var n in customFields) {
        fields.push(customFields[n].getLabel())
        }
Logger.log(fields)

      if(fields.indexOf('insas')==-1){

          contacts[i].addCustomField('insas','oui')
      }
    }
  }
person Serge insas    schedule 01.11.2012
comment
спасибо - я направлялся в твоем направлении, но ты подобрал меня намного быстрее! Дело в том, что я пытаюсь проверить значение, а не метку - работает ли этот код (я пока попробую), если я отключу getLabel с помощью getValue? - getUserDefinedField легко дает значение, если я предоставляю метку, поэтому у меня он был вверху, чтобы заставить мяч катиться, сравнивая его с 'testvalue'. - person user1783229; 02.11.2012
comment
и да, я обнаружил logger.logs - очень полезно, спасибо. в основном я пытаюсь проверить значение метки настраиваемого поля, и если тест окажется верным, удалите все поле. Я как бы предпочитаю использовать устаревший getUserDefinedField, чтобы получить значение вверху. :-) Да, иногда я хочу использовать Google, но если я смогу настроить его, я буду очень счастлив для своих целей. Я обнаружил, что могу делать базовые отчеты и тому подобное с GAS. - person user1783229; 02.11.2012
comment
Вы действительно можете переключить оператор getLabel() на getValue() и вместо этого провести сравнение ... извините за ошибку в моем коде, я не знал, что вам нужно :-) Я обновил код - person Serge insas; 02.11.2012
comment
нет, вы хороши - узнали что-то новое - я думал, что getValue зависит от getLabel - но они по сути независимы - так что это важно знать. Я собираюсь сделать гибрид вашего, моего текущего и моего оригинала, и если он сработает, я опубликую его здесь - спасибо - person user1783229; 02.11.2012
comment
возникла проблема - идея состоит в том, чтобы эта функция проверяла все контакты в группе - и удаляла эти настраиваемые поля с этой меткой и этим значением (`` неустановленное '' значение - это фиктивное значение, которое я импортировал в контакты Google для создания настраиваемого поля) . текущий набор кода удаляет все настраиваемые поля этой метки - тьфу, это слишком сложно объяснить при наборе текста, и я работал над этой одной проблемой в течение 12 часов - я просто собираюсь отказаться от этого и позволить Google снова претендовать на победу - person user1783229; 02.11.2012
comment
спасибо - заставил это работать - почти позволил Google победить, но я слишком упрям ​​- просто нужно было очень быстро узнать, какой правильный синтаксис был для того, что мне было нужно - это, и ваш код привел меня туда - спасибо! - person user1783229; 02.11.2012
comment
снова борюсь - я переделываю - я удалил эти настраиваемые поля заполнителя в контактах Google. так что теперь поле / метка / значение взносов исчезли. Поэтому я могу легко добавить настраиваемое поле, но поскольку я буду запускать эту функцию снова и снова, я не хочу, чтобы одно и то же настраиваемое поле добавлялось к контактам, у которых оно уже есть. возникли проблемы с синтаксисом и логическим порядком - есть мысли, как переделать приведенный выше код в соответствии с тем, что я делаю? - person user1783229; 02.11.2012
comment
хорошо, вернулся и добавил `` неустановленный '' и упростил код, используя setValue, который, как я обнаружил, работает - поэтому больше не удаляйте и не добавляйте - просто обновляйте - новый код вместо старого кода выше - person user1783229; 02.11.2012
comment
это здорово - спасибо, будет работать, чтобы включить его (к вашему комментарию перед моим последним - который не был загружен, когда я оставил последний комментарий, fyi) - person user1783229; 03.11.2012
comment
по какой-то причине это не сработало - казалось, что проверка контакта, чтобы увидеть, присутствуют ли поля, пропускала его, если только настраиваемое поле не было в последней точке массива indexof. странный - person user1783229; 08.11.2012
comment
да, протестировано снова, похоже, с моим Окончательным кодом настраиваемое поле будет обновлено только в том случае, если это последнее настраиваемое поле. Если я возьму функцию проверки наличия поля, то установленное значение будет работать нормально - очень странно, я не уверен, что мне не хватает. - person user1783229; 08.11.2012
comment
снова протестирован - каким-то образом метод push мешает else if - я не знаю, может быть, просто собираюсь удалить настраиваемое поле add и покончить с этим - person user1783229; 08.11.2012
comment
ладно, думаю, я понял - я разбил 2-ю функцию, потому что она извлекала из того же 'n' и присвоил ей 'j' - отредактированный код выше - person user1783229; 08.11.2012