Google apps script 导入生日';将Gmail中的联系人存储到电子表格中

Google apps script 导入生日';将Gmail中的联系人存储到电子表格中,google-apps-script,Google Apps Script,我正在使用由提供的“Contact Listings.gs”脚本的自定义版本GoogleAppsScript@google.com将Gmail联系人的数据导入谷歌电子表格。 我无法导入生日 以下是我尝试使用的代码: function listContacts() { var parameters = SpreadsheetApp.getActiveRange().getValues()[0]; var group = parameters.shift(); var people;

我正在使用由提供的“Contact Listings.gs”脚本的自定义版本GoogleAppsScript@google.com将Gmail联系人的数据导入谷歌电子表格。 我无法导入生日

以下是我尝试使用的代码:

function listContacts() {
  var parameters = SpreadsheetApp.getActiveRange().getValues()[0];
  var group = parameters.shift();

  var people;
  if ((group) && (group!=""))  {
    var contactGroup = ContactsApp.findContactGroup(group);
    if (contactGroup)
      people = contactGroup.getContacts();
  } else
    people = ContactsApp.getAllContacts();

  if (!people)
    return;

  // grab all the contacts
  var retvalues = new Array();
  for (var i in people) {    
    var value = new Array();
    value.push(people[i].getFullName());
    value.push(people[i].getHomeAddress());
    value.push(people[i].getPrimaryEmail());
    value.push(people[i].getMobilePhone());
    value.push(people[i].getHomePhone());
    value.push(people[i].getDates(ContactsApp.Field.BIRTHDAY));

    for (var j in parameters) {
      var info = people[i]["get"+parameters[j]]();
      value.push(info);
    }
    retvalues.push(value);
  }

  var r;
  if ((group) || (parameters.length>0))
    r = SpreadsheetApp.getActiveRange().getRowIndex()+1;
  else
    r = SpreadsheetApp.getActiveRange().getRowIndex();

  var c = SpreadsheetApp.getActiveRange().getColumnIndex();
  if (retvalues.length>0)
        SpreadsheetApp.getActiveSheet().getRange(r,c,retvalues.length,retvalues[0].length).setValues(retvalues);
  else
    SpreadsheetApp.getActiveSheet().getRange(r,c).setValue("No contacts found.");
}
脚本使用“DateField”而不是可读的生日日期填充单元格

有什么想法吗?

方法返回一个对象数组,每个对象都必须检索天或月

在您的代码中,替换该行

value.push(people[i].getDates(ContactsApp.Field.BIRTHDAY));
使用此代码

var dates = [];
var birthdays = people[i].getDates(ContactsApp.Field.BIRTHDAY);
for (var i in birthdays) {
  dates.push(birthdays[i].getMonth()+'/'+birthdays[i].getDay());
}
value.push(dates.join(' + '));// in case there is more than 1 birthday  !?!
编辑: 以下评论

要以数字日期格式显示值,请在代码末尾添加此行:

SpreadsheetApp.getActiveSheet().getRange(1,6,retvalues.length,1).setNumberFormat('d/MM/yyyy');

我以前从未在ContactApp中玩过约会,我不得不说,这太可怕了。多么疯狂的
DateField
对象。以下是我的解决方案:

函数listContacts(){
var contactGroup=ContactsApp.findContactGroup(“系统组:系列”);
如果(!contactGroup)抛出“找不到组”;
var people=contactGroup.getContacts();
var值=[['全名','地址','电子邮件','手机','电话','生日'];
对于(人中的变量i){
var birthday=people[i].getDates(ContactsApp.Field.birthday);
值。推([
people[i].getFullName(),
people[i].getHomeAddress(),
people[i].getPrimaryEmail(),
people[i].getMobilePhone(),
people[i].getHomePhone(),
生日.length?parseDateField(生日[0]):“”,
]);
}
var s=SpreadsheetApp.getActiveSheet();
s、 getDataRange().clear();
s、 getRange(1,1,values.length,values[0].length).setValues(values);
}
函数parseDateField(df){
返回新日期(
df.getYear(),
{1月0日,2月1日,3月2日,4月3日,5月4日,6月5日,7月6日,
八月:7日、九月:8日、十月:9日、十一月:10日、十二月:11}[df.getMonth()],
df.getDay());
}

此解决方案与使用“/”分隔符并让电子表格解析的不同之处在于:这不依赖电子表格,如果您希望在代码中直接使用此日期,这可能很重要,例如
CalendarApp

非常好!非常感谢你。但是有没有办法将月份转换成数字而不是字母呢?你的电子表格可以做到这一点,只需使用列格式。。。如果需要,我使用/分隔符强制该值成为电子表格中的日期。或者使用脚本,只需添加
SpreadsheetApp.getActiveSheet().getRange(1,6,retvalues.length,1).setNumberFormat('d/MM/yyyyy')在脚本的结尾,无意冒犯,我想我可以接受的不仅仅是一个答案。感谢Henrique:-)我在代码中添加的最后一次更新,值肯定会是电子表格中的日期,但您的解决方案确实允许fir直接将日期用作JS日期。。。谢谢,投了赞成票@你的Sergeinsas也是一个很好的解决方案,我只是在发布后才看到它(大约半小时后!)。但是顺便说一下,这个DateField对象是不必要的愚蠢。我真的很感动!你说得对。。。我猜这个想法是,生日不应该有“年”属性(也没有时间值),因为它的重复性。。。但这太傻了,我同意。非常感谢你们,你们让我开心!