Google表单onFormSubmit(编辑时)会导致重复

时间:2014-01-20 07:00:12

标签: google-apps-script google-contacts google-form

修改

以下是编辑现有联系表单的执行记录(我什么也没看到删除任何现有联系人?)。

[14-01-21 13:39:03:306 EST] Starting execution
[14-01-21 13:39:03:311 EST] FormResponse.getItemResponses() [0.001 seconds]
[14-01-21 13:39:03:311 EST] (class).getResponse() [0 seconds]
[14-01-21 13:39:03:312 EST] (class).getResponse() [0 seconds]
[14-01-21 13:39:03:312 EST] (class).getResponse() [0 seconds]
[14-01-21 13:39:03:312 EST] (class).getResponse() [0 seconds]
[14-01-21 13:39:03:312 EST] (class).getResponse() [0 seconds]
[14-01-21 13:39:03:312 EST] (class).getResponse() [0 seconds]
[14-01-21 13:39:03:312 EST] (class).getResponse() [0 seconds]
[14-01-21 13:39:03:312 EST] (class).getResponse() [0 seconds]
[14-01-21 13:39:03:456 EST] ContactsApp.getContactGroup([System Group: My Contacts]) [0.143 seconds]
[14-01-21 13:39:04:634 EST] ContactGroup.getContacts() [1.178 seconds]
[14-01-21 13:39:04:637 EST] Contact.getEmails([WORK_EMAIL]) [0 seconds]
[14-01-21 13:39:04:637 EST] EmailField.toString() [0 seconds]
[14-01-21 13:39:04:718 EST] ContactsApp.createContact([JOTTER, BOT, jotterbot@stackoverflow.com]) [0.08 seconds]
[14-01-21 13:39:04:719 EST] Contact.getEmails([HOME_EMAIL]) [0 seconds]
[14-01-21 13:39:04:802 EST] EmailField.setLabel([WORK_EMAIL]) [0.082 seconds]
[14-01-21 13:39:04:877 EST] EmailField.setAsPrimary() [0.074 seconds]
[14-01-21 13:39:04:959 EST] Contact.addPhone([MOBILE_PHONE, 12345]) [0.081 seconds]
[14-01-21 13:39:05:168 EST] Contact.addPhone([WORK_PHONE, 67890]) [0.209 seconds]
[14-01-21 13:39:05:252 EST] Contact.addCompany([CompanyInc, BadCoderYep]) [0.083 seconds]
[14-01-21 13:39:05:386 EST] Contact.addAddress([WORK_ADDRESS, 123 Company Place, Suburb, State]) [0.133 seconds]
[14-01-21 13:39:05:625 EST] Contact.addToGroup([ContactGroup]) [0.237 seconds]
[14-01-21 13:39:05:625 EST] Contact.toString() [0 seconds]
[14-01-21 13:39:05:625 EST] ContactGroup.addContact([Contact]) [0.237 seconds]
[14-01-21 13:39:05:625 EST] Contact.getEmails([WORK_EMAIL]) [0 seconds]
[14-01-21 13:39:05:625 EST] EmailField.toString() [0 seconds]
[14-01-21 13:39:05:696 EST] ContactsApp.createContact([JOTTER, BOT, jotterbot@stackoverflow.com]) [0.069 seconds]
[14-01-21 13:39:05:696 EST] Contact.getEmails([HOME_EMAIL]) [0 seconds]
[14-01-21 13:39:05:766 EST] EmailField.setLabel([WORK_EMAIL]) [0.069 seconds]
[14-01-21 13:39:05:823 EST] EmailField.setAsPrimary() [0.056 seconds]
[14-01-21 13:39:05:986 EST] Contact.addPhone([MOBILE_PHONE, 12345]) [0.162 seconds]
[14-01-21 13:39:06:062 EST] Contact.addPhone([WORK_PHONE, 67890]) [0.075 seconds]
[14-01-21 13:39:06:145 EST] Contact.addCompany([CompanyInc, BadCoderYep]) [0.082 seconds]
[14-01-21 13:39:06:236 EST] Contact.addAddress([WORK_ADDRESS, 123 Company Place, Suburb, State]) [0.091 seconds]
[14-01-21 13:39:06:389 EST] Contact.addToGroup([ContactGroup]) [0.152 seconds]
[14-01-21 13:39:06:389 EST] Contact.toString() [0 seconds]
[14-01-21 13:39:06:389 EST] ContactGroup.addContact([Contact]) [0.152 seconds]
[14-01-21 13:39:06:390 EST] Execution succeeded [3.079 seconds total runtime]

这是一个递归问题还是什么?

我有一个表单,可以将联系人直接添加到我的Gmail联系人中 - 从表单中获取值。

首次提交时,它工作正常,但是当我再次编辑表单时,我得到2 x新编辑的详细信息,旧的联系人仍然存在。再次运行时,会添加4个联系人,然后是8个联系人,依此类推。

似乎是一个愚蠢的错误。我在这里缺少什么?

function onFormSubmit(e) {

var formResponses = e.response.getItemResponses();

  var firstName = formResponses[0].getResponse().toString();
  var lastName = formResponses[1].getResponse().toString();
  var emailAddress = formResponses[2].getResponse().toString();
  var company = formResponses[3].getResponse().toString();
  var position = formResponses[4].getResponse().toString();
  var mobileNumber = formResponses[5].getResponse().toString();
  var workNumber = formResponses[6].getResponse().toString();
  var workAddress = formResponses[7].getResponse().toString();

  // Get all of our contacts in group "My Contacts". 
  // Later we will check the submitted values against the existing contacts to avoid duplicates.
  var group = ContactsApp.getContactGroup("System Group: My Contacts");
  var myContacts = group.getContacts();

  // try finding contact first by email address to avoid duplicates.
  for (var i = 0; i < myContacts.length; i++) {

    if(myContacts[i].getEmails(ContactsApp.Field.WORK_EMAIL)[0] == emailAddress) { 

      //contact exists so lets update it's values to latest in form submission
      //var contact = ContactsApp.getContact(emailAddress).deleteContact();

      myContacts[i].deleteContact();

      var contact = ContactsApp.createContact(firstName, lastName, emailAddress);
        contact.getEmails(ContactsApp.Field.HOME_EMAIL)[0].setLabel(ContactsApp.Field.WORK_EMAIL);
        contact.addPhone(ContactsApp.Field.MOBILE_PHONE, mobileNumber);
        contact.addPhone(ContactsApp.Field.WORK_PHONE, workNumber);
        contact.addCompany(company, position);
        contact.addAddress(ContactsApp.Field.WORK_ADDRESS, workAddress);

      group.addContact(contact);

    } else {

      //contact does not yet exist so we will create it from scratch  
      var contact = ContactsApp.createContact(firstName, lastName, emailAddress);
        contact.getEmails(ContactsApp.Field.HOME_EMAIL)[0].setLabel(ContactsApp.Field.WORK_EMAIL);
        contact.addPhone(ContactsApp.Field.MOBILE_PHONE, mobileNumber);
        contact.addPhone(ContactsApp.Field.WORK_PHONE, workNumber);
        contact.addCompany(company, position);
        contact.addAddress(ContactsApp.Field.WORK_ADDRESS, workAddress);

        // Adding our contact to the "My Contacts" group
        group.addContact(contact);

    }
  }
}

1 个答案:

答案 0 :(得分:0)

为了互联网正义,这是解决方案。

我做了一些错误,但在询问on the google product forums后,我被告知我正在将emailAddress对象与字符串值进行比较,因此我的检查总是会失败并且无论如何都会创建新的联系人。无论如何,我确定现有联系人的方法在最终代码中已经改变。

所以这里是在Form中工作的精炼代码(触发器设置为onFormSubmit):

function onFormSubmit(e) {

  var formResponses = e.response.getItemResponses();

  var firstName = formResponses[0].getResponse().toString();
  var lastName = formResponses[1].getResponse().toString();
  var emailAddress = formResponses[2].getResponse().toString();
  var company = formResponses[3].getResponse().toString();
  var position = formResponses[4].getResponse().toString();
  var mobileNumber = formResponses[5].getResponse().toString();
  var workNumber = formResponses[6].getResponse().toString();
  var workAddress = formResponses[7].getResponse().toString();

  // Get all of our contacts in group "My Contacts". 
  var myContactsGroup = ContactsApp.getContactGroup("System Group: My Contacts"); 

  // Check to see if the email address already exists
  var existingContact = ContactsApp.getContact(emailAddress);  

  // If the email address doesn't exist, create a new contact and add it to the group
  if (existingContact == null)
  {
    var newContact = ContactsApp.createContact(firstName, lastName, emailAddress);
    newContact.getEmails(ContactsApp.Field.HOME_EMAIL)[0].setLabel(ContactsApp.Field.WORK_EMAIL).setAsPrimary();
    newContact.addPhone(ContactsApp.Field.MOBILE_PHONE, mobileNumber);
    newContact.addPhone(ContactsApp.Field.WORK_PHONE, workNumber);
    newContact.addCompany(company, position);
    newContact.addAddress(ContactsApp.Field.WORK_ADDRESS, workAddress);

    myContactsGroup.addContact(newContact);
  }

  // Otherwise simply update the details of the existing contact
  else
  { 
    existingContact.setGivenName(firstName);
    existingContact.setFamilyName(lastName);
    existingContact.setFullName(firstName + " " + lastName);
    existingContact.getPhones(ContactsApp.Field.MOBILE_PHONE)[0].setPhoneNumber(mobileNumber);
    existingContact.getPhones(ContactsApp.Field.WORK_PHONE)[0].setPhoneNumber(workNumber);
    existingContact.getCompanies()[0].setCompanyName(company);
    existingContact.getCompanies()[0].setJobTitle(position);
    existingContact.getAddresses(ContactsApp.Field.WORK_ADDRESS)[0].setAddress(workAddress);    
  }
}