谷歌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);
。这已经足够了。有没有这么多的联系...
我有这样的错误消息经常。这是我做的:
这可能是msgBox调用的结果。替换Browser.msgBox(“...”);与Logger.log(“...”);然后,您可以在脚本编辑器>查看>日志中查看结果...
脚本可能需要在电子表格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()});
这应该克服任何短期利率限制。让我们知道你是如何去的。
由于此问题与Google Apps脚本有关,并且与App Engine无关,因此我编辑了标签。 – 2012-07-24 15:47:19
@Adam Crossland谢谢 – Sebastian 2012-07-25 06:50:03