見出し画像

GASで連絡先を操作する - 最新版

ContactsAppの廃止

2022年1月、Google Apps Scriptで連絡先を操作するContactsAppが廃止されてしまいました。その結果として、GASから簡単に連絡先ことGoogle Contactsを操作することが出来なくなってしまいました。

代わりにREST APIとして利用できていた「People API」がGASのAdvanced Serviceにあるのでこれを利用して操作する必要があります。予め、サービスからPeopleapiを追加しておきましょう。

図:Advanced Serviceの1つとして用意されてる

People APIの利用

People APIはGASの流儀ではないコードの書き方が必要で、尚且資料が少ない為、ちょっとまとめるのに苦労しました。

ポイント

ポイントは2つ。更新時に利用するetagという値および登録するユーザのresourceNameという値

etagは連絡先を編集する度に変更されこの値を書き込み時に指定する必要があり、常に最新版と一致しないと書き込みが出来ません。また、resourceNameは各ユーザにユニークに割り当てられてる値で、メールアドレスとは違い、people/c78787878といった値になっています。

このresourceNameで各登録先を操作するため、これも予め取得しておかないと対象の連絡先の再編集が出来ません。

APIの利用制限

APIにはQuotaが設けられていますが、これ一律ではないようです。自分はあるAPIのQuotaは180/1分のリクエストが上限になっていますが、会社で使ってるアカウントだと90/1分。

よって、たくさんの連絡先操作をするのに1つずつ追加や編集していると非常に遅いため6分の制限も超えてしまうだけでなく、Quotaに引っかかって実行できなくなってしまいます。

個別に1つずつではなく、たくさんの編集や追加をする場合にはBatchCreateやBatchUpdateといった一括処理用のAPIでまとめて行う必要性があります。

ソースコード

1名分の連絡先を作成する

 //作成するリソースの中身
var contactResource = {
  "names": [{
    "displayNameLastFirst": username,
    "givenName": userman[1],
    "familyName": userman[0],
  }],
  "phoneNumbers": [{
    'value': telnum
  }],
  "emailAddresses": [{
    'value': mailman
  }],
  "organizations": {
    'name': busyo
  },
}
var contactResourceName = People.People.createContact(contactResource)["resourceName"];

contactResourceを作成し、createContactで追加する。非常に単純なコードです。

1名分の連絡先を更新する

//リクエストボディを構築する
var resource = {
  "etag": etag,
  "organizations": {
    'name': busyo
  },
  "phoneNumbers": [{
    'value': telnum
  }],
};

//コンタクトを更新
People.People.updateContact(resource,resourceName,{updatePersonFields: "organizations,phoneNumbers"});

更新は複雑で予め対象連絡先のetagの値とresourceNameを取得しておく必要があります。第2引数に更新するフィールドも明示的に指定が必要です。

ラベルを付ける

//リクエストボディを構築する
var membersResource = {
  "resourceNamesToAdd": [
    contactResourceName
  ]
}
People.ContactGroups.Members.modify(membersResource, groupResourceName); 

contactResourceNameは各連絡先のresourceNameを配列でまとめたもの。groupResourceNameとは対象のラベルのgroupResourceNameでこれもあらかじめ取得しておく必要があります。

バッチリクエストで追加

//リクエストボディを構築する
temparr.contactPerson = {
  emailAddresses: [{ value: rec[0]}],
  names: [
    { familyName: username[0], givenName: username[1] },
  ],
  "phoneNumbers": [{
    'value': rec[2]
  }],
  "emailAddresses": [{
    'value': rec[0]
  }],
  "organizations": {
    'name': rec[3]
  }
}

let obj = {
  contacts: temparray,
  readMask: "emailAddresses,names,phoneNumbers,organizations"
};

//BatchCreate Request
let response = People.People.batchCreateContacts(obj)["createdPeople"];

複数名を一括で追加する場合contactsに複数名分のcontactPersonの値を配列で格納し、それをbatchCreateContactsで追加します。500名程度でも数秒で追加が完了します。

バッチリクエストで更新

//リクエストデータを連想配列で作成
let temparr = {
  "etag": rec[6],
  "organizations": {
    'name': rec[3]
  },
  "phoneNumbers": [{
    'value': rec[2]
  }],
}

//リソース名をキーにオブジェクトとしてobjへ追加する
let key = rec[5];
obj[key] = temparr;

//リクエストボディを作成する
let obj2 = {
  contacts: obj,
  updateMask: "phoneNumbers,organizations",
  readMask: "phoneNumbers,organizations",
};

//アップデートを実行
let res = People.People.batchUpdateContacts(obj2);

バッチリクエストで追加と異なり、連絡先情報の塊にetagが必要でこれを複数名contactsに追加するわけですが、objにあたる部分は配列ではない点が嵌りどころ。ここは連想配列contactsに対して、各連絡先のresourceNameをキーとしてその下にリクエストデータを追加したものを複数連結し、batchUpdateContactsしなければなりません。

詳細や応用編はこちら

#GAS #JavaScript #People API #連絡先 #Contacts


この記事が気に入ったらサポートをしてみませんか?