REST APIで別アプリからのデータ取得ができず困っております。
実行後、“指定したAPIトークンは、アプリで生成されたトークンと異なります。”
というエラーが発生し、データの取得ができません。
kintoneもREST APIも初心者でトークンの使い方が間違えているのでしょうか。
ご指南いただければ幸いです。
別アプリ(車両管理)のアプリIDは4で、そのアプリでAPIトークンを生成しています。
以下スクリプトを配置しているアプリ(運行管理)のアプリIDは3です。
運行管理アプリで画面表示の際にログインユーザの社員番号をキーとして、
車両管理アプリから車種と登録番号を取得しようとしています。
function getXXXInfo(event){
var constEmpNumber = ‘012345’;
var params = ‘?app=4&query=’ +
encodeURIComponent(‘社員番号=’ + constEmpNumber) + ‘&’ +
encodeURIComponent(‘fields[0]=車種’) + ‘&’ +
encodeURIComponent(‘fields[1]=登録番号’);
var url = ‘https://{サブドメイン}.cybozu.com/k/v1/records.json’ + params;
var xhr = new XMLHttpRequest();
xhr.open(‘GET’, url);
xhr.setRequestHeader(‘X-Requested-With’, ‘XMLHttpRequest’);
xhr.setRequestHeader(‘X-Cybozu-API-Token’, ‘hogehogehogehogehoge’);
xhr.setRequestHeader(‘Content-Type’, ‘application/json’);
xhr.onload = function() {
if (xhr.status === 200) {
// success
} else {
// error
}
};
xhr.send();
return event;
}
//イベントの定義
kintone.events.on([‘app.record.create.show’,‘mobile.app.record.create.show’], getXXXInfo);
既出の投稿も確認しましたが、うまくいきませんでした。
何かヒントがございましたらよろしくお願いします。
※他の投稿を見ていてもトークンがない状態のものが多く、いらないのかな?と思ったりしますが、初めてなもので、何も解決策が思いつきませんでした。
JavaScriptカスタマイズででREST APIを実行する場合、xhrを使わずとも、JavaScript用にREST APIリクエストをするための機構が存在します。
https://cybozudev.zendesk.com/hc/ja/articles/202166310-kintone-REST-API-リクエスト#step1
上記サンプルに従うと下記の用にしてデータ取得できます。(未検証なのでタイプミスあったらすいません)
var params = {
app: 4,
query: '社員番号 = "012345"'
};
kintone.events.on(['app.record.create.show','mobile.app.record.create.show'], function(event) {
kintone.api('/k/v1/records', 'GET', params, function(resp) {
// レコード番号を表示する
alert(resp['record']['$id']['value']);
}, function(resp) {
// エラーの場合はメッセージを表示する
var errmsg = 'レコード取得時にエラーが発生しました。';
// レスポンスにエラーメッセージが含まれる場合はメッセージを表示する
if (resp.message !== undefined) {
errmsg += '' + resp.message;
}
alert(errmsg);
});
returne event;
})();
ちなみに、kintone上のJavaScriptカスタマイズだと本来トークンは必要ありません。(すでにログインしている状態なので、そのユーザーの権限の範囲でデータを取得することができます)
トークンを使うパターンとしては、外部のサーバーからkintoneのデータを取得するなどの場合です。
村濱さま
コメントありがとうございました。
無事にデータの取得ができました。
とても勉強になりました。
var params = {
app: 4,
query: '社員番号 = "012345"'
};
kintone.events.on(['app.record.create.show','mobile.app.record.create.show'], function(event) {
kintone.api('/k/v1/records', 'GET', params, function(resp) {
if (resp.records[0] !== null) {
**event.record['車種'].value =resp['record'][0]['車種']['value'];**
}else{
alert('車の登録がありません');
}
}, function(resp) {
// エラーの場合はメッセージを表示する
var errmsg = 'レコード取得時にエラーが発生しました。';
// レスポンスにエラーメッセージが含まれる場合はメッセージを表示する
if (resp.message !== undefined) {
errmsg += '' + resp.message;
}
alert(errmsg);
});
return event;
})();
太字部分のように運行管理アプリ側のフィールドに反映させようとしましたが、非同期処理だからでしょうか、
データが反映いたしませんでした。
恐縮ではございますが、こちらについてもご指導賜れますと幸いでございます。
過去投稿やリファレンスなど確認して、調整してみましたがうまくいきませんでした。
千葉さん
はい、レコード取得前に、return event しているので、イベント処理が完了しています。
レコード取得後に return event するには、promise 処理に変更しましょう。
こんな感じで行けると思います。ただし切り貼りしただけなので検証をお願いいたします。
kintone.events.on(['app.record.create.show','mobile.app.record.create.show'], function(event) {
return kintone.api('/k/v1/records', 'GET', params).then(function(resp) {
if (resp.records[0] !== null) {
event.record['車種'].value =resp['record'][0]['車種']['value'];
}else{
alert('車の登録がありません');
}
return event;
}, function(resp) {
// エラーの場合はメッセージを表示する
var errmsg = 'レコード取得時にエラーが発生しました。';
// レスポンスにエラーメッセージが含まれる場合はメッセージを表示する
if (resp.message !== undefined) {
errmsg += '' + resp.message;
}
alert(errmsg);
return event;
});
});
rex0220さま
ありがとうございます。
promise処理に修正してみましたが、反映しませんでした。
return kintone.api(…)の前にreturn eventをすると、社員番号と社員氏名は表示されるのですが、
以下コードのままだと、社員番号と社員氏名、車種と登録番号の4つすべてが表示されない状況です。
基本的な質問で恐縮ですが、よろしくお願いします。
(function () {
"use strict";
kintone.events.on(['app.record.create.show','mobile.app.record.create.show'], function getUserInfo(event){
//社員番号
event.record['社員番号'].value = kintone.getLoginUser().employeeNumber;
//氏名
event.record['社員氏名'].value = kintone.getLoginUser().name;
var params = {
"app": 4,
"query": "社員番号 = \"" + event.record['社員番号'].value + "\"",
};
return kintone.api('/k/v1/records', 'GET', params).then(
function(resp) {
if (resp.records[0] !== null) {
event.record['車種'].value = resp['records'][0]['車種']['value'];
event.record['登録番号'].value = resp['records'][0]['登録番号']['value'];
}else{
alert('車の登録がありません');
}
return event;
}, function(resp) {
var errmsg = 'レコード取得時にエラーが発生しました。';
if (resp.message !== undefined) {
errmsg += '' + resp.message;
}
alert(errmsg);
return event;
});
});
})();
千葉さん
ごめんなさい。調べたところ、create.show イベントでは promise が使えませんでした。
どうも、show イベント内の非同期処理ではレコードの get,set 関数を使えということらしいです。
こちらのコードを試してください。
なお社員番号・氏名は、そのままevent で変更しています。
(function () {
"use strict";
kintone.events.on(['app.record.create.show','mobile.app.record.create.show'], function getUserInfo(event){
//社員番号
event.record['社員番号'].value = kintone.getLoginUser().employeeNumber;
//氏名
event.record['社員氏名'].value = kintone.getLoginUser().name;
var params = {
"app": 4,
"query": "社員番号 = \"" + event.record['社員番号'].value + "\"",
};
kintone.api('/k/v1/records', 'GET', params).then(
function(resp) {
if (resp.records[0] !== null) {
if(event.type='app.record.create.show'){
var record = kintone.app.record.get();
record.record['車種'].value = resp['records'][0]['車種']['value'];
record.record['登録番号'].value = resp['records'][0]['登録番号']['value'];
kintone.app.record.set(record);
}
else{
var record = kintone.mobile.app.record.get();
record.record['車種'].value = resp['records'][0]['車種']['value'];
record.record['登録番号'].value = resp['records'][0]['登録番号']['value'];
kintone.mobile.app.record.set(record);
}
}else{
alert('車の登録がありません');
}
}, function(resp) {
var errmsg = 'レコード取得時にエラーが発生しました。';
if (resp.message !== undefined) {
errmsg += '' + resp.message;
}
alert(errmsg);
});
return event;
});
})();
rex0220さま
ご連絡遅くなり申し訳ございません。
また、修正していただいたコードで目的達成ができました。
大変助かりました。
ご協力深謝申し上げます。
また、機会がございましたら、よろしくお願いいたします。