JSforceを使ってみたのでメモ。φ( ̄ー ̄ )メモメモ
リストビューのメタ情報を取得を取得したい
JSForceでは、フルネームでの参照になります。
メタデータなので当然ですが、ID での参照はできません。
また、リストビューの ID の取得もできませんでした。
どうしても ID が必要な場合は本記事下部を参照。
リストビューのメタ情報を取得
<apex:page controller="CustomController">
<script src="//cdnjs.cloudflare.com/ajax/libs/jsforce/1.7.0/jsforce.min.js"></script>
<button onclick="readListView();"> ビュー表示 </button>
<script>
function readListView(){
var conn = new jsforce.Connection({ accessToken: '{!$Api.Session_Id}' });
var fullNames = [ 'Contact.All' ]; // オブジェクト名.対象ビューのAPI名
conn.metadata.read('ListView', fullNames, function(err, metadata) {
if (err) {
console.error(err);
} else {
console.log(metadata);
}
});
}
</script>
</apex:page>
リストビューのメタ情報を更新したい
リストビューの作成・更新は、メタ情報を設定する必要があります。
更新の場合、必須項目以外は設定しなければ前の情報が引き継がれるようです。
リストビューのメタ情報を更新
<apex:page controller="CustomController">
<script src="//cdnjs.cloudflare.com/ajax/libs/jsforce/1.7.0/jsforce.min.js"></script>
<button onclick="createListView();"> ビュー更新 </button>
<script>
function createListView(){
var conn = new jsforce.Connection({ accessToken: '{!$Api.Session_Id}' });
var metadata = [{
booleanFilter: '1 AND 2',
columns: ['FULL_NAME', 'CONTACT.EMAIL', 'CONTACT.BIRTHDATE', 'CustomField__c'],
filterScope: 'Everything',
filters: [{ field : 'FULL_NAME', operation: 'contains', value: 'WEA' },
{ field : 'CONTACT.EMAIL', operation: 'contains', value: '@gmail.com' }],
sharedTo : {}, // 自分だけに表示
fullName: 'Contact.CustomView', // オブジェクト名.対象ビューのAPI名
label: 'カスタムビュー',
language: 'ja'
}];
conn.metadata.update('ListView', metadata, function(err, metadata) {
if (err) {
console.error(err);
} else {
console.log(metadata);
}
});
}
</script>
</apex:page>
ListView Meta情報の定義はこちらを参照
Metadata API Developer Guide - ListView
リストビューのIDを取得したい
絶対欲しくなるので、JS Remotingで実装しました(Visualforce上で実装に限る)
幸いリストビューのAPI名がわかるので、ListView.obj
のDeveloperName
に当ててIDを引っ張り出します。
IDを取得するjs
function getListViewId(listViewName){
Visualforce.remoting.timeout = 120000;
Visualforce.remoting.Manager.invokeAction(
'{!$RemoteAction.DemCustomViewController.getListView}',
listViewName, //
function(result, event){
if (event.status) {
console.log(result.Id);
}
},
{escape: true}
);
}
上記jsで呼び出されるApexコード
@RemoteAction
global static ListView getListView(String listViewName) {
return [SELECT Id, DeveloperName FROM ListView WHERE SobjectType = 'Contact' and DeveloperName = :listViewName][0];
}