谷歌Apps脚本与我们联系服务错误

问题描述:

首先,我知道,有一个similar question但它只是相似,不一样:)谷歌Apps脚本与我们联系服务错误

这个脚本导入谷歌联系人 - >Contacts Sevices,在电子表格中。

function onOpen() 
{ 
    var menuItems = [{name: "Gmail Contact Import", functionName: "getContacts"}]; 
    SpreadsheetApp.getActiveSpreadsheet().addMenu("import", menuItems); 
} 

function getContacts() 
{ 
    var groupName = "MyGroup"; 
    var contacts; 
    var sheet = SpreadsheetApp.getActiveSheet(); 

    if (groupName) { 
    var contactGroup = ContactsApp.findContactGroup(groupName); 

    if (contactGroup) { 
     contacts = contactGroup.getContacts(); 
    } 
    } 
    else { 
    contacts = ContactsApp.getAllContacts(); 
    } 

    if (!contacts) { 
    Browser.msgBox("no contacts found!"); 
    return; 
    } 

    sheet.clear(); 

    sheet.getRange("A1").setValue("forename"); 
    sheet.getRange("B1").setValue("lastname"); 
    sheet.getRange("C1").setValue("private email"); 
    sheet.getRange("D1").setValue(groupName + " email"); 
    sheet.getRange("E1").setValue("phone"); 
    sheet.getRange("F1").setValue("mobile"); 
    sheet.getRange("G1").setValue("street"); 
    sheet.getRange("H1").setValue("zip"); 
    sheet.getRange("I1").setValue("city"); 
    sheet.getRange("J1").setValue("group"); 
    sheet.getRange("K1").setValue("date1"); 
    sheet.getRange("L1").setValue("date2"); 
    sheet.getRange("M1").setValue("date3"); 
    sheet.getRange("N1").setValue("date4"); 

    for (var i = 0; i < contacts.length; i++) { 
    var addressArray = new Array(); 
    addressArray = contacts[i].getAddresses(ContactsApp.Field.HOME_ADDRESS); 
    var addressArrayLength = addressArray.length;  
    for (var ii = 0; ii < addressArrayLength; ii++) { 
     var address = addressArray[ii].getAddress(); 
     var addressSplit = address.split(/\r\n|\r|\n/); 
     var street = addressSplit[0]; 
     var city = addressSplit[1].split(" ")[0]; 
     var zip = addressSplit[1].split(" ")[1]; 
    } 
    var homePhone = contacts[i].getHomePhone().replace("0049-","0").toString(); 
    var mobilePhone = contacts[i].getMobilePhone().replace("0049-","0").toString(); 
    var fireMail = "" 
    var privateMail = ""; 
    var mailArray = new Array(); 
    mailArray = contacts[i].getEmails(ContactsApp.Field.HOME_EMAIL); 
    var mailArrayLength = mailArray.length;  
    for (var ii = 0; ii < mailArrayLength; ii++) { 
     privateMail = contacts[i].getEmails(ContactsApp.Field.HOME_EMAIL)[ii].getAddress(); 
    } 

    if (!privateMail) 
    { 
     mailArray = contacts[i].getEmails(ContactsApp.Field.WORK_EMAIL); 
     mailArrayLength = mailArray.length; 

     for (var ii = 0; ii < mailArrayLength; ii++) { 
     privateMail = contacts[i].getEmails(ContactsApp.Field.WORK_EMAIL)[ii].getAddress(); 
     } 
    } 

    mailArray = contacts[i].getEmails(groupName); 
    mailArrayLength = mailArray.length; 

    for (var ii = 0; ii < mailArrayLength; ii++) { 
     fireMail = contacts[i].getEmails(groupName)[ii].getAddress(); 
    } 

    sheet.getRange(1*i+2, 1, 1, 1).setValue(contacts[i].getGivenName()); 
    sheet.getRange(1*i+2, 2, 1, 1).setValue(contacts[i].getFamilyName()); 
    sheet.getRange(1*i+2, 3, 1, 1).setValue(privateMail); 
    sheet.getRange(1*i+2, 4, 1, 1).setValue(fireMail); 
    sheet.getRange(1*i+2, 5, 1, 1).setValue(homePhone); 
    sheet.getRange(1*i+2, 6, 1, 1).setValue(mobilePhone); 
    sheet.getRange(1*i+2, 7, 1, 1).setValue(street); 
    sheet.getRange(1*i+2, 8, 1, 1).setValue(zip); 
    sheet.getRange(1*i+2, 9, 1, 1).setValue(city); 

    var groups = contacts[i].getContactGroups(); 

    for (var j = 0; j < groups.length; j++) { 
     var name = groups[j].getName(); 
     switch (name) { 
     case "group1": 
      sheet.getRange(1*i+2, 10, 1, 1).setValue(1); 
      break; 
     case "group2": 
      sheet.getRange(1*i+2, 10, 1, 1).setValue(2); 
      break; 
     case "group3": 
      sheet.getRange(1*i+2, 10, 1, 1).setValue(3); 
      break; 
     case "group4": 
      sheet.getRange(1*i+2, 10, 1, 1).setValue(4); 
      break; 
     case "group5": 
      sheet.getRange(1*i+2, 10, 1, 1).setValue(5); 
      break; 
     default: 
      break; 
     } 

     if (name.indexOf("datetrigger1") > -1) 
     { 
     var dateArray = contacts[i].getDates("date1"); 
     var dateArrayLength = dateArray.length;   
     for (var ii = 0; ii < dateArrayLength; ii++) { 
      var date = contacts[i].getDates("date1")[ii]; 
      var day = date.getDay(); 
      var month = date.getMonth(); 
      var year = date.getYear(); 
      sheet.getRange(1*i+2, 11, 1, 1).setValue(day.toString() + "." + month.toString() + "." + year.toString()); 
     } 
     sheet.getRange(1*i+2, 11, 1, 1).setBackgroundColor('green'); 
     } 

     if (name.indexOf("datetrigger2") > -1) 
     { 
     var dateArray = contacts[i].getDates("date2"); 
     var dateArrayLength = dateArray.length;   
     for (var ii = 0; ii < dateArrayLength; ii++) { 
      var date = contacts[i].getDates("date2")[ii]; 
      var day = date.getDay(); 
      var month = date.getMonth(); 
      var year = date.getYear(); 
      sheet.getRange(1*i+2, 12, 1, 1).setValue(day.toString() + "." + month.toString() + "." + year.toString()); 
     } 
     sheet.getRange(1*i+2, 12, 1, 1).setBackgroundColor('green'); 
     } 

     if (name.indexOf("datetrigger3") > -1) 
     { 
     var dateArray = contacts[i].getDates("date3"); 
     var dateArrayLength = dateArray.length;   
     for (var ii = 0; ii < dateArrayLength; ii++) { 
      var date = contacts[i].getDates("date3")[ii]; 
      var day = date.getDay(); 
      var month = date.getMonth(); 
      var year = date.getYear(); 
      sheet.getRange(1*i+2, 13, 1, 1).setValue(day.toString() + "." + month.toString() + "." + year.toString()); 
     } 
     sheet.getRange(1*i+2, 13, 1, 1).setBackgroundColor('green'); 
     } 

     if (name.indexOf("datetrigger4") > -1) 
     { 
     var dateArray = contacts[i].getDates("date4"); 
     var dateArrayLength = dateArray.length; 
     if (dateArrayLength > 0) { 
      for (var ii = 0; ii < dateArrayLength; ii++) { 
      var date = contacts[i].getDates("date4")[ii]; 
      var day = date.getDay(); 
      var month = date.getMonth(); 
      var year = date.getYear(); 
      sheet.getRange(1*i+2, 14, 1, 1).setValue(day.toString() + "." + month.toString() + "." + year.toString()); 
      } 
      sheet.getRange(1*i+2, 14, 1, 1).setBackgroundColor('green'); 
     } 
     } 
    } 
    } 

    Browser.msgBox(contacts.length + " contacts imported."); 
} 

工作正常,但消息“进口XY接触”后,我收到此错误信息:

Unexpected exception upon serializing continuation

我无法弄清楚什么是错的。

更新2012-07-26:

我有一个额外的错误:

Dienst-Fehler: ContactsApp: Temporary problem - please try again later and consider using batch operations. The user is over quota. (Zeile 96)

这是关于该行:var groups = contacts[i].getContactGroups();

我已经试了一次后...错误仍然来临。总是我在我的列表中得到结果。该错误出现在循环的各种迭代之后。

更新2012-07-27:

var groups = contacts[i].getContactGroups();后添加Utilities.sleep(2000);。这已经足够了。有没有这么多的联系...

+0

由于此问题与Google Apps脚本有关,并且与App Engine无关,因此我编辑了标签。 – 2012-07-24 15:47:19

+0

@Adam Crossland谢谢 – Sebastian 2012-07-25 06:50:03

我有这样的错误消息经常。这是我做的:

  1. 这可能是msgBox调用的结果。替换Browser.msgBox(“...”);与Logger.log(“...”);然后,您可以在脚本编辑器>查看>日志中查看结果...

  2. 脚本可能需要在电子表格UI中无法触发的授权。通过脚本编辑器>运行> getContacts运行脚本。

希望这会有所帮助。

日更新7月27日:

在回答你关于配额的错误后问题:

谷歌已经拒绝服务防御的若干层,其中之一是为用户的配额。一些GAS服务配额在这里列出https://script.google.com/dashboard(去配额限制选项卡),但不是所有这些配额都公开。例如,您的错误不适用于那里列出的配额。

另一层是速率限制,如果您在短时间(例如1秒)内进行太多次API调用,您可能会达到阈值,这是我认为正在发生的事情。良好的做法是使用指数退避。谷歌表示,在放弃不可恢复的错误之前,您应该使用指数退避执行多达5次重试,重试时间约为1,2,4,8和16秒,总共需要约32秒。请参阅:https://developers.google.com/google-apps/documents-list/#implementing_exponential_backoff

我有一个GASRetry库函数,我用它自动执行指数回退。我维护它here,它是可以作为一个公共图书馆项目的关键:MGJu3PS2ZYnANtJ9kyn2vnlLDhaBgl_dE太

以你的代码行作为一个例子,你将它包装在一个GASRetry调用是这样的:

//var groups = contacts[i].getContactGroups(); 
var groups = GASRetry.call(function(){contacts[i].getContactGroups()}); 

这应该克服任何短期利率限制。让我们知道你是如何去的。

+0

谢谢,但我得到了一个额外的错误。看看下面的问题_UPDATE 2012-07-26_ – Sebastian 2012-07-26 11:13:43

+0

@XmlmXmlmX我更新了我的答案后,您的新错误更新。 – 2012-07-26 22:02:50

+0

啊,好的。我试过了,但是群组是空的吗?现在我只在'var groups = contacts [i] .getContactGroups();'之后添加了'Utilities.sleep(2000);'。这已经足够了。没有那么多的联系人...... – Sebastian 2012-07-27 12:27:16