将Gmail中的来自生日的联系人导入电子表格

时间:2014-09-03 10:42:39

标签: google-apps-script

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

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

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”填充单元格,而不是可读的生日日期。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

getDates()方法返回一个对象数组,每个对象都有specific methods来检索日期或月份。

在您的代码中替换

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');

答案 1 :(得分:1)

我之前从未在ContactApp玩过日期,我不得不说,这太可怕了。什么是疯狂的DateField对象。这是我的解决方案:

function listContacts() {
  var contactGroup = ContactsApp.findContactGroup('System Group: Family');
  if( !contactGroup ) throw 'Group not found';
  var people = contactGroup.getContacts();

  var values = [['FullName','Address','Email','Mobile','Phone','Birthday']];
  for( var i in people ) {    
    var birthday = people[i].getDates(ContactsApp.Field.BIRTHDAY);
    values.push([
      people[i].getFullName(),
      people[i].getHomeAddress(),
      people[i].getPrimaryEmail(),
      people[i].getMobilePhone(),
      people[i].getHomePhone(),
      birthday.length ? parseDateField(birthday[0]) : '',
    ]);
  }

  var s = SpreadsheetApp.getActiveSheet();
  s.getDataRange().clear();
  s.getRange(1,1,values.length,values[0].length).setValues(values);
}

function parseDateField(df) {
  return new Date(
    df.getYear(),
    {JANUARY:0,FEBRUARY:1,MARCH:2,APRIL:3,MAY:4,JUNE:5,JULY:6,
     AUGUST:7,SEPTEMBER:8,OCTOBER:9,NOVEMBER:10,DECEMBER:11}[df.getMonth()],
    df.getDay());
}

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