別アプリのデータ取得ができない

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さま

ご連絡遅くなり申し訳ございません。

また、修正していただいたコードで目的達成ができました。

大変助かりました。

ご協力深謝申し上げます。

また、機会がございましたら、よろしくお願いいたします。