Sansan 名刺情報取得コネクターの提供 : Custom Connector

SansanのコネクターはDomoオフィシャルで提供されておらず、Custom Connectorを作成しての対応が必要です。

 

2019年10月追記 === ここから ===

このバージョン 1.x のエンドポイントは、2019年9月末で廃止されたようです。

バージョン 2.x 系のAPIがSansanから提供されています。利用を継続するにはソースの変更が必要そうです。

=== ここまで ===

 

※以下に Sansan Custom Connector のサンプルソースを添付します。
※Sansanよりソース公開の許可を頂きました。
※もし、以下のソースを利用してCustom Connectorを作成する際は自己責任でお願いします。Sansan株式会社(Sansan, Inc.)及びDomoはいかなる責任も負いません。また、サポートも致しておりません。(初期バージョンは株式会社エムティーアイ様よりご提供いただきました)
※無断での転載は禁止です。
 Please do not reprint without my permission.

 

■以下 サンプルソース
 名刺情報を一括で取得します。
 API仕様上タグの一括取得はできません。
 カラム名の日本語、英語表記に対応しています。

=========================================================================
✓Configure user authentication
=========================================================================
----------------------------
Select authentication credentials type
----------------------------
Api Key
----------------------------
Authentication Script
----------------------------
DOMO.log('Configuration Run. ');
console.log('Configuration Run. ');
if(true) {
auth.authenticationSuccess();
} else {
auth.authenticationFailed('');
}
=========================================================================
✓Configure selectable reports
=========================================================================
----------------------------
AVAILABLE REPORTS
----------------------------
Biz Cards


----------------------------
PARAMETERS
----------------------------
Name Language
Help Text Language of header column name.

Required ✓
Type Dropdown
Options 日本語
Options English
=========================================================================
✓Define how data is processed
=========================================================================
/*
* SanSan名刺データ取得
* API制限 200リクエスト/5分 300件/リクエスト
*/

// デバッグ設定
var debugFlag = false; // 名刺取得件数をデバッグ用に削減
var debugLimit = 3; // debug時 一度に取得するけ名刺件数
var debugRoop = 0; // debug時 名刺情報取得3回ループして終了用

// API利用制限
// var apiLimitMsec = 5 * 60 * 1000; // 5分のミリ秒
// var apiLimitRequest = 100; // 5分で100回

var apiLimitMsec = 5 * 60 * 1000; // 5分のミリ秒
var apiLimitRequest = 200; // 5分で200回
var apiLimitLine = 300; // 一度に取得する名刺件数 Max 300

// 初期値
var offset = 0;
var baseUrl = 'https://api.sansan.com/v1.2/bizCards/search?range=all';
var appId = null;

// カラム名設定 カード
var columnNameCardId = '';
var columnNameCardCompanyId = '';
var columnNameCardPersonId = '';
var columnNameCardExchangeDate = '';
var columnNameCardRegisteredTime = '';

var columnNameCardOwnerId = '';
var columnNameCardOwnerName = '';
var columnNameCardOwnerEmail = '';

var columnNameCardLastName = '';
var columnNameCardFirstName = '';
var columnNameCardName = '';
var columnNameCardLastNameReading = '';
var columnNameCardFirstNameReading = '';
var columnNameCardNameReading = '';
var columnNameCardDepartmentName = '';
var columnNameCardTitle = '';
var columnNameCardEmail = '';
var columnNameCardMobile = '';
var columnNameCardCompanyName = '';
var columnNameCardPostalCode = '';
var columnNameCardAddress = '';
var columnNameCardPrefecture = '';
var columnNameCardCity = '';
var columnNameCardStreet = '';
var columnNameCardBuilding = '';
var columnNameCardTel = '';
var columnNameCardSecondTel = '';
var columnNameCardFax = '';
var columnNameCardUrl = '';
var columnNameCardMemo = '';
var columnNameCardEntryStatus = '';


// ここから処理開始 =====================================================
try {
// API KeyをHTTPヘッダーに設定
DOMO.log('API Key Set.');
console.log('API Key Set.');
httprequest.addHeader('X-Sansan-Api-Key', metadata.account.apikey);

if(appId) {
httprequest.addHeader('X-Sansan-App-Id', appId);
}

if(debugFlag) {apiLimitLine = debugLimit;}

// 言語選択
var language = metadata.parameters['Language'].toUpperCase();
switch(language) {
case '日本語':
setColumnJa();
break;
case 'ENGLISH':
setColumnEn();
break;
default:
setColumnJa();
break;
}

// レポート選択
var report = metadata.report.toUpperCase();
switch(report) {
case 'BIZ CARDS':
setCardsColumn(); // カラム設定
loadCards(); // 名刺情報取得
break;
/*
case 'TAGS (日本語)':
setTagsColumnJa(); // カラム設定
loadTags(); // 名刺情報取得
break;
case 'TAGS (ENGLISH)':
setTagsColumnEn(); // カラム設定
loadTags(); // 名刺情報取得
break;
*/
default:
setCardsColumn(); // カラム設定
loadCards(); // 名刺情報取得
break;
}

} catch(e) {
DOMO.log('Error: ' + e.stack);
console.log('Error: ' + e.stack);
datagrid.error(-1, "Error: " + e.stack);
throw new Error(e);
}

//ロジック終了
DOMO.log('Define code end. ');
console.log('Define code end. ');


// 以降 function zone ===================================================

/*
* 名刺情報取得
* 取得件数制限制限で一度に取得できない名刺情報をループしながら取得
*/
function loadCards() {
var apiLimitClear = true;
var apiLimitCount = 0;
var apiLimitStart = null;

while(true) {
var res = httprequest.get(baseUrl + '&limit=' + apiLimitLine + '&offset=' + offset);
// DOMO.log('res: ' + res);
// console.log('res: '+ res);

if(apiLimitClear) {
apiLimitClear = false;
apiLimitCount = 1;
apiLimitStart = new Date();
}

var resJson = JSON.parse(res);
var hasMore = resJson.hasMore;
var cards = resJson.data;

DOMO.log('hasMore: ' + hasMore + ' / getData: ' + (offset + 1) + ' - ' + (offset + cards.length));
console.log('hasMore: ' + hasMore + ' / getData: ' + (offset + 1) + ' - ' + (offset + cards.length));

// データが正しく取得できなかった場合
if(hasMore === null) {
DOMO.log('bizCards Request Error: ' + resJson.statusCode + ' / Message: ' + resJson.message + ' / Error: ' + resJson.error);
console.log('bizCards Request Error: ' + resJson.statusCode + ' / Message: ' + resJson.message + ' / Error: ' + resJson.error);
throw new Error('bizCards Request Error: ' + resJson.statusCode + ' / Message: ' + resJson.message + ' / Error: ' + resJson.error);
}

// セルにデータを追加
setCell(cards);

// API制限数に達したらスリープする
if(apiLimitCount >= apiLimitRequest) {
apiLimitClear = true;
sleep(apiLimitMsec - (new Date() - apiLimitStart) + (30 * 1000)); // 30秒多くスリープさせる
} else {
apiLimitCount = apiLimitCount + 1|0;
}

if(!hasMore) {break;}
offset = offset + apiLimitLine;

if(debugFlag) {
debugRoop = debugRoop + 1|0;
if(debugRoop >= 3) {break;}
}
}
}


/*
* カードのカラムを日本語カラム名で定義します。
*/
function setColumnJa() {
// Cards
columnNameCardId = '名刺ID';
columnNameCardCompanyId = '会社ID';
columnNameCardPersonId = '人物ID';
columnNameCardExchangeDate = '名刺交換日';
columnNameCardRegisteredTime = '名刺登録日時';

columnNameCardOwnerId = 'オーナーID';
columnNameCardOwnerName = 'オーナー名';
columnNameCardOwnerEmail = 'オーナーメールアドレス';

columnNameCardLastName = '姓';
columnNameCardFirstName = '名';
columnNameCardName = '氏名';
columnNameCardLastNameReading = '姓カナ';
columnNameCardFirstNameReading = '名カナ';
columnNameCardNameReading = '氏名カナ';
columnNameCardDepartmentName = '部署名';
columnNameCardTitle = '役職';
columnNameCardEmail = 'メールアドレス';
columnNameCardMobile = '携帯番号';
columnNameCardCompanyName = '会社名';
columnNameCardPostalCode = '郵便番号';
columnNameCardAddress = '住所';
columnNameCardPrefecture = '都道府県';
columnNameCardCity = '市区町村';
columnNameCardStreet = '番地';
columnNameCardBuilding = 'ビル名';
columnNameCardTel = '電話番号';
columnNameCardSecondTel = '電話番号2';
columnNameCardFax = 'FAX番号';
columnNameCardUrl = 'URL';
columnNameCardMemo = 'メモ';
columnNameCardEntryStatus = '登録ステータス';
}


/*
* カードのカラムを英語カラム名で定義します。
*/
function setColumnEn() {
// Cards
columnNameCardId = 'CardId';
columnNameCardCompanyId = 'CompanyId';
columnNameCardPersonId = 'PersonId';
columnNameCardExchangeDate = 'ExchangeDate';
columnNameCardRegisteredTime = 'RegisteredTime';

columnNameCardOwnerId = 'OwnerId';
columnNameCardOwnerName = 'OwnerName';
columnNameCardOwnerEmail = 'OwnerEmail';

columnNameCardLastName = 'LastName';
columnNameCardFirstName = 'FirstName';
columnNameCardName = 'Name';
columnNameCardLastNameReading = 'LastNameReading';
columnNameCardFirstNameReading = 'FirstNameReading';
columnNameCardNameReading = 'NameReading';
columnNameCardDepartmentName = 'DepartmentName';
columnNameCardTitle = 'Title';
columnNameCardEmail = 'Email';
columnNameCardMobile = 'Mobile';
columnNameCardCompanyName = 'CompanyName';
columnNameCardPostalCode = 'PostalCode';
columnNameCardAddress = 'Address';
columnNameCardPrefecture = 'Prefecture';
columnNameCardCity = 'City';
columnNameCardStreet = 'Street';
columnNameCardBuilding = 'Building';
columnNameCardTel = 'Tel';
columnNameCardSecondTel = 'SecondTel';
columnNameCardFax = 'Fax';
columnNameCardUrl = 'Url';
columnNameCardMemo = 'Memo';
columnNameCardEntryStatus = 'EntryStatus';
}


/*
* カラムを定義します。
*/
function setCardsColumn() {
DOMO.log('setCardsColumn(): ');
console.log('setCardsColumn(): ');

datagrid.addColumn(columnNameCardId, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardCompanyId, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardPersonId, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardExchangeDate, datagrid.DATA_TYPE_DATETIME); // yyyy-MM-dd
datagrid.addColumn(columnNameCardRegisteredTime, datagrid.DATA_TYPE_DATETIME); // yyyy-MM-dd'T'HH:mm:ss

datagrid.addColumn(columnNameCardOwnerId, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardOwnerName, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardOwnerEmail, datagrid.DATA_TYPE_STRING);

datagrid.addColumn(columnNameCardLastName, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardFirstName, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardName, datagrid.DATA_TYPE_STRING); // 追加

datagrid.addColumn(columnNameCardLastNameReading, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardFirstNameReading, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardNameReading, datagrid.DATA_TYPE_STRING); // 追加

datagrid.addColumn(columnNameCardDepartmentName, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardTitle, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardEmail, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardMobile, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardCompanyName, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardPostalCode, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardAddress, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardPrefecture, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardCity, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardStreet, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardBuilding, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardTel, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardSecondTel, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardFax, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardUrl, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardMemo, datagrid.DATA_TYPE_STRING);
datagrid.addColumn(columnNameCardEntryStatus, datagrid.DATA_TYPE_STRING);
}


/*
* セルにデータを追加します。
* @param {Object[]} cards - JSON Object
*/
function setCell(cards) {
DOMO.log('setCell(cards): ');
console.log('setCell(cards): ');

for(var j = 0; j < cards.length; j++) {
var card = cards[j];
var cardOwner = cards[j].owner;

// DOMO.log('setCell: ' + card);
// console.log('setCell: ' + card);
// console.log(JSON.stringify(card,null,'\t'));

datagridAddCell(card.id);
datagridAddCell(card.companyId);
datagridAddCell(card.personId);

datagridAddCell((card.exchangeDate === null) ? null : card.exchangeDate + 'T00:00:00');
datagridAddCell(card.registeredTime);

datagridAddCell(cardOwner.id);
datagridAddCell(cardOwner.name);
datagridAddCell(cardOwner.email);

datagridAddCell(card.lastName);
datagridAddCell(card.firstName);

if(card.lastName === null && card.firstName === null) {
datagridAddCell(null);
} else {
datagridAddCell(ifnull(card.lastName,'') + ' ' + ifnull(card.firstName,'')); // 追加
}

datagridAddCell(card.lastNameReading);
datagridAddCell(card.firstNameReading);

if(card.lastNameReading === null && card.firstNameReading === null) {
datagridAddCell(null);
} else {
datagridAddCell(ifnull(card.lastNameReading,'') + ' ' + ifnull(card.firstNameReading,'')); // 追加
}

datagridAddCell(card.departmentName);
datagridAddCell(card.title);
datagridAddCell(card.email);
datagridAddCell(card.mobile);
datagridAddCell(card.companyName);
datagridAddCell(card.postalCode);
datagridAddCell(card.address);
datagridAddCell(card.prefecture);
datagridAddCell(card.city);
datagridAddCell(card.street);
datagridAddCell(card.building);
datagridAddCell(card.tel);
datagridAddCell(card.secondTel);
datagridAddCell(card.fax);
datagridAddCell(card.url);
datagridAddCell(card.memo);
datagridAddCell(card.entryStatus);

datagrid.endRow();
}
}


/*
* valueが"null"文字列の場合にnullにしてデータグリッドに設定します。
* @param {string} value データグリッドに設定する値
*/
function datagridAddCell(value) {
// Domo不具合 nullが設定できない問題対応
if(ifnull(value, null) === null) {
datagrid.addCell();
} else {
datagrid.addCell(value);
}
// datagrid.addCell(ifnull(value ,null));
// datagrid.addCell(ifnull(value ,''));
}


/*
* beforeがnull又はundefinedの場合、afterを返します。nullでは無い場合beforeを返します。
* beforeが"null"文字列の場合でも、afterを返します。
* @param {string} before - 検証対象の文字列
* @param {string} after - beforeがnullの場合に返す文字列
* @returns {string} before 又は after 文字列
*/
function ifnull(before, after) {
return (before === null || before == null || before == "null") ? after : before;
}


/*
* 処理をスリープします。
* @param {int} waitMsec - スリープさせる時間(ミリ秒)
*/
function sleep(waitMsec) {
DOMO.log('sleep(' + waitMsec + ')');
console.log('sleep(' + waitMsec + ')');
console.log('sleep start:' + new Date());

DOMO.sleep(waitMsec);

console.log('sleep end :' + new Date());
}

 

11
11 votes

· Last Updated

Comments

  • このバージョン 1.x のエンドポイントは、2019年9月末で廃止されたようです。

    バージョン 2.x 系のAPIがSansanから提供されているので、利用を継続するにはソースの変更が必要そうです。