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も使えるのでもっと柔軟な抽出、集計が出来ます。