2016-05-25

jsforceを使ったSalesforce便利TIPS

jsforceはメタデータ操作が他の言語のライブラリよりも扱いやすいので、手軽に高度なことができちゃいます。ということで便利なオレオレTIPSを備忘として残しておきますー

IPアドレス制限の追加

WebUIからチマチマやらずに済むのが良い感じ
var jsforce = require('jsforce');
var conn = new jsforce.Connection({});
conn.login('{username}', '{password}', function(err, userInfo) {
  conn.metadata.update('Profile', {
    fullName: '{Profile Name}',
    loginIpRanges: [
    {
      startAddress:'0.0.0.0',
      endAddress:'255.255.255.255'
     }
  });
});

項目レベルセキュリティ設定の取得

任意のプロファイルに対する項目レベルセキュリティをCSVファイルとして出力します。
var jsforce = require('jsforce');
var conn = new jsforce.Connection({});
conn.login('{username}', '{password}', function(err, userInfo) {
  if (err) { return console.error(err); }
  conn.metadata.read('Profile', ['{Profile Name}'], function(err, metadata) {
    if (err) { console.error(err); }
    console.log(['SObject', 'Field', 'Readable', 'Editable'].join(','));
    meta.fieldPermissions.forEach(function(permission){
      var fieldInfo = permission.field.split('.');
      console.log([fieldInfo[0], fieldInfo[1], permission.readable, permission.editable].join(','));
    });
  });
});

CSVから項目レベルセキュリティの設定

こんな感じのCSVを定義して、項目レベルセキュリティを設定します。
SObject,Field,Readable,Editable
Hoge__c,Fuga__c,true,true
Account,Foo__c,true,false

コードはこんな感じで(csvライブラリを利用)

var fs = require('fs'); 
var csv = require('csv');
var parse = require('csv-parse');

var fieldPermissions=[];
fs.createReadStream('./fieldpermission.csv')
  .pipe(parse({delimiter: ',', columns: true}))
  .on('data', function(csvrow) {
    fieldPermissions.push({
      field: csvrow.SObject + '.' + csvrow.Field, 
      readable: csvrow.Readable,
      editable: csvrow.Editable
    });
  })
  .on('end',function() {
    var jsforce = require('jsforce');
    var conn = new jsforce.Connection({});
    conn.login('{username}', '{password}', function(err, userInfo) {
      conn.metadata.update('Profile', {
        fullName: '{Profile Name}',
        fieldPermissions: fieldPermissions
      }, function(err, userInfo) { console.log(err); console.log(userInfo);});
    });
  });

SQL操作をしたい場合

csvファイルをSQLで扱えるqとの合わせ技で、Salesforceのレコードに対してSQLを適用できます。

まずはこんな感じでコードを書いて

var jsforce = require('jsforce');
var conn = new jsforce.Connection({});
conn.login('{username}', '{password}', function(err, userInfo) {
  var query = conn.sobject(process.argv[2])
    .find({})
    .execute({ autoFetch : true })
    .stream()
    .pipe(process.stdout); 
});

コマンドライン上でこんな感じで利用します

$ node query.js "Contact" | q -H -d , \
"SELECT Name, count(*) FROM - GROUP BY AccountId, Name"

上記例はApexでも出来るレベルですが、CASE文やJOINも使えるのでもっと柔軟な抽出、集計が出来ます。

おまけ

MetadataAPIの仕様上、メタデータの抽出・作成・更新などは一回で最大10個までしか指定できません。それ以上の数を指定する場合はchunkにして複数回コールする必要があります。
このエントリーをはてなブックマークに追加