Google电子表格,用于添加和编辑/更新Gmail通讯录

时间:2014-01-17 02:02:29

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

一些背景:
(我希望我有更多的肉体代表,因为我想发布图像和链接到我的研究)。

我正在使用我们公司的Intranet Portal(在Google协作平台上)上的Awesome Tables gadget来获取电话簿,页面导航,序列号等。好吧,太棒了!

新项目旨在整合添加功能,更重要的是,直接从内部网门户编辑/更新Gmail联系人。我使用this example from the Awesome Tables site作为我的起点。

我需要什么!:

经过编辑的Google表单将响应电子表格(在正确的行上)中的单元格更新为“需要更新”的方法。我已经读过代码需要驻留在Google表单中才能使触发器工作(如果代码在电子表格中,则onFormSubmit不能用于编辑)。

此外,对代码道歉并且如果我没有正确地编写编码术语,那么我首先要去处理一些bash脚本之外的任何严重问题。此外,如果这一切都可以通过其他方式完成,以便您仍然可以在Google网站上对您的Gmail联系人进行“实时”和可编辑的反映,我对此持开放态度。请继续阅读!

我在哪里:

电子表格代码:

// Sheet Variables Below
var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 2;
var MaxRow = sheet.getLastRow(); 
var dataRange = sheet.getDataRange();
var data = dataRange.getValues();     // Read all data
data.splice(0,headerRows);            // Remove header rows

function addContact() {
  for (var i = 0; i < data.length; i++) { 
    var row = data[i];
    var firstName = row[1]; 
    var lastName = row[2];      
    var emailAdd = row[3];
    var companyAdd = row[4];
    var positionAdd = row[5];
    var mobileAdd = row[6];
    var workphoneAdd = row[7];
    var addressAdd = row[8];
    var statusRow = row[9];
      if(statusRow != "Uploaded") {
        var contact = ContactsApp.createContact(firstName, lastName, emailAdd);
        contact.addPhone(ContactsApp.Field.MOBILE_PHONE, mobileAdd);
        contact.addPhone(ContactsApp.Field.WORK_PHONE, workphoneAdd);
        contact.addCompany(companyAdd, positionAdd);
        contact.addAddress(ContactsApp.Field.WORK_ADDRESS, addressAdd)

        var group = ContactsApp.getContactGroup("System Group: My Contacts");
        group.addContact(contact);

        // Finally, once we have uploaded the contact, set Status to "Uploaded".
        for (var iRow = 3; iRow <= MaxRow; iRow++) {
        sheet.getRange("K" + iRow).setValue('Uploaded');
        }
      }
  }
}


function updateContact() {
  for (var i = 0; i < data.length; i++) { 
    var row = data[i];
    var statusRow = row[9];  
      if(statusRow == "Needs Update") {
        // Retrieve Contact by email address and delete. If they have changed the email address though you are in big trouble and will receive an error. TODO!
        var contact = ContactsApp.getContact(row[3]); ContactsApp.deleteContact(contact);

        // Remove "Needs Update"
        for (var iRow = 3; iRow <= MaxRow; iRow++) {
        var value = sheet.getRange("K" + iRow).getValue();
          if(value == 'Needs Update'){
            sheet.setActiveRange(sheet.getRange(iRow, 11)).setValue('');
          }
        }
      }
  }
  // Re-run the addContact to effectively have "updated" the contact data. 
  addContact();
}

var formURL = 'https://<formURLgoesHERE>/viewform';
var sheetName = 'Form Responses';
var columnIndex = 11;
var statusIndex = 10;

function getEditResponseUrls(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  var data = sheet.getDataRange().getValues();
  var form = FormApp.openByUrl(formURL);
  for(var i = 2; i < data.length; i++) {
    if(data[i][0] != '' && data[i][columnIndex-1] == '') {
      var timestamp = data[i][0];
      var formSubmitted = form.getResponses(timestamp);
      if(formSubmitted.length < 1) continue;
      var editResponseUrl = formSubmitted[0].getEditResponseUrl();
      var status = "Just Added";
      var button = '<div style="text-align:center"><a href="' + editResponseUrl + '" ';
      button+= 'style="color:white!important;text-decoration:none;background-color:rgb(209,72,54);background-image:-webkit-linear-gradient(top,rgb(221,75,57),rgb(209,72,54));border:1px solid rgba(0,0,0,0);border-radius:2px;display:inline-block;font-size:11px;font-weight:bold;height:27px;line-height:27px;padding:0px 20px 0px 20px;text-align:center;text-transform:uppercase;white-space:nowrap"';
      button+= 'target="_blank">Edit entry</a></div>';
      sheet.getRange(i+1, statusIndex).setValue(status);
      sheet.getRange(i+1, columnIndex).setValue(button);
    }
  }
}

因此,通过上述内容,我可以从表单条目创建新联系人,并且如果状态列是“需要更新”,我可以删除联系人并使用新的详细信息重新添加联系人(除非电子邮件地址是改变的值,这是我知道的一个明显的缺陷 - 如果你也能解决这个问题,可以获得奖励积分。)

要点:

当他们提交新条目时,一切正常。但是,如果他们然后点击编辑按钮并在表单中更新他们的详细信息,我需要一种方法将状态更新为“需要更新”,因为这是我的“updateContact”功能正在寻找的。

会喜欢思想或指导,我已经沉浸在这里,并且真的很想让它发挥作用。我觉得它“非常接近”,我只需要一个小变量来实现我的功能触发器“让它超越线路”,我希望你能做到这一点!

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解你的问题,但这可能是一个孤独。

创建触发器

首先,您需要创建一个触发器,以便在提交表单时运行needsUpdate()函数。您可以通过编程方式执行此操作,如下所示。

function onInstall(){  
 var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    ScriptApp.newTrigger("needsUpdate").forSpreadsheet(ss).onFormSubmit().create();
}

或者,您可以通过选择&#34;资源&#34;在脚本编辑器中手动添加触发器。顶部菜单中的按钮然后选择&#34;当前项目的触发器&#34;然后&#34;添加一个新的触发器&#34;。然后,您应该在第一个下拉菜单中选择needsUpdate()功能,&#34;来自电子表格&#34;在第二个下拉菜单中,&#34;在表单提交&#34;在第三个下拉菜单中。

创建needsUpdate()功能

接下来,您必须创建一个在表单提交上运行的函数。该功能将转到statusRow并添加&#34;需要更新&#34;。传递给此函数的e是从表单提交传递给它的data

function needsUpdate(e) {
// the columns and rows could change depending on how you spreadsheet is set up
var column = e.range.getColumn()
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
sheet.getRange(9, column).setValue("Needs Update");
}