他のアプリのフィールド値を利用してメールの本文作成

いつもお世話になっております。
他のアプリを利用して、メールの本文作成を行おうと考えております。
本格的にjavascriptを学んでないため、少々知識をお貸しください。

kintone.Promiseのfunction内で複数回kintone.apiを呼び出すことは可能でしょうか?

return new kintone.Promise(function(resolve, reject) {
// 一回目の呼び出し(ログインユーザーの組織情報)
var params = {
‘code’: loginUserCode
};
var logflg = 0;
//ログインユーザーの組織情報からフィールドの表示項目を決定する。
kintone.api(path, ‘GET’, params, function(resp){
// フィールドコードが「組織」のフィールドに取得した組織名をセット
loginUserdes = resp.organizationTitles[0].organization.name;
if (loginUserdes == “000”) {
kintone.app.record.setFieldShown(‘Cheack’,false);
} else {
//①この値が書き変わらない。
logflg = 1;
}
}, function(resp){
var errmsg = ‘所属組織取得時にエラーが発生しました。’;
if (resp.message !== undefined){
errmsg += ‘’ + resp.message;
}
});

// 二回目の呼び出し(他のアプリからデータ取得)
params = {
‘app’: ,
‘query’: ‘Drop_Apri in("tttt")’,
‘fields’: [‘Drop_Member’, ‘Line_Mail’]
};
if (logflg == 1) {
//ボタンの作成&設定
var myIndexButton = document.createElement(‘button’);
myIndexButton.id = ‘my_index_button’;
myIndexButton.innerHTML = ‘メール送信’;
var el = kintone.app.record.getHeaderMenuSpaceElement();
el.appendChild(myIndexButton);

// ボタンクリック時の処理
myIndexButton.onclick = function() {
kintone.api(‘/k/v1/records’, ‘GET’, params, function(resp) {
// レコードを取得する
var resbuf = resp.records;
var resi = resbuf.length;
for(var i = 0; i <resi; i++) {
MAIL = MAIL + resbuf[i][‘Line_Mail’][‘value’] + “;”;
}

var link = document.createElement(‘a’);
link.href=‘mailto:’+MAIL+‘?subject=’+title+‘&body=’+honbun; link.id = ‘Send’;link.name = ‘mailSend’;
el.appendChild(link);
link.appendChild(myIndexButton);
resolve(event);
}, function() {
alert(“レコード取得時にエラーが発生しました。”);
resolve(event);
});
}
});

現在、一回目の呼び出しの①の値が書き変わりません。他の投稿内容を見る限りでは、kintone.app.record.setを使用し、一度フィールドに一次データを確保するしか方法はないのでしょうか?

よろしくお願い致します。

ナカゴウユイエさん
cstapの瀧ヶ平です。

logfig変数が変更されない理由ですが、kintone.apiは非同期で通信を行い、通信が終了次第コールバック処理を行うことに起因しています。
つまり、kintone.apiを実行後、通信処理の結果を待たずに次の処理を行い、通信処理が終わり次第コールバック処理を行うということになりますので、logfig変数の条件は通信処理が終わる前に比較されることになります。

また、kintone.apiメソッドはコールバック処理を引数に入れなければデフォルトでkintone.Promiseオブジェクトを返却するため、kintone.api(params…).then(callback1).then(callback2)の形で処理を記述することにより、thenの引数のcallback1関数で返却した値を、メソッドチェーンでつないだ次のcallback2関数の引数に割り当てることができます。

そのため、logfigの値はPromiseの.thenメソッドチェーンを利用して渡すことで確実に任意の値を与えることができます。

また、このコード上ではボタンのonclick上でeventをresolveしていますがonclickの処理はkintoneのイベント処理とは関係がなく、ボタンが押されるまでレコードの値の更新を待つというような処理となってしまうため、kintone.apiメソッドの実行後にeventオブジェクトを返却し、ボタンのonclick内で更新する際はkintone.app.record.setなどのメソッドでレコードを更新した方が良いかと思います。

長くなりましたが、以上の点を考慮してコードを書き替えてみたので参考にしていただければ幸いです。

var params = {
'code': loginUserCode
};
//ログインユーザーの組織情報からフィールドの表示項目を決定する。
kintone.api(path, 'GET', params).then(function(resp){
// フィールドコードが「組織」のフィールドに取得した組織名をセット
loginUserdes = resp.organizationTitles[0].organization.name;
if (loginUserdes == "000") {
kintone.app.record.setFieldShown('Cheack',false);
return 0
} else {
return 1
}
}).catch(function(resp){
var errmsg = '所属組織取得時にエラーが発生しました。';
if (resp.message !== undefined){
errmsg += '' + resp.message;
}
}).then(function(logfig){
// 二回目の呼び出し(他のアプリからデータ取得)
params = {
'app': ,
'query': 'Drop_Apri in(\"tttt\")',
'fields': ['Drop_Member', 'Line_Mail']
};
if (logflg == 1) {
//ボタンの作成&設定
var myIndexButton = document.createElement('button');
myIndexButton.id = 'my_index_button';
myIndexButton.innerHTML = 'メール送信';
var el = kintone.app.record.getHeaderMenuSpaceElement();
el.appendChild(myIndexButton);

// ボタンクリック時の処理
myIndexButton.onclick = function() {
kintone.api('/k/v1/records', 'GET', params, function(resp) {
// レコードを取得する
var resbuf = resp.records;
var resi = resbuf.length;
for(var i = 0; i <resi; i++) {
MAIL = MAIL + resbuf[i]['Line_Mail']['value'] + ";";
}

var link = document.createElement('a');
link.href='mailto:'+MAIL+'?subject='+title+'&body='+honbun; link.id = 'Send';link.name = 'mailSend';
el.appendChild(link);
link.appendChild(myIndexButton);
}, function() {
alert("レコード取得時にエラーが発生しました。");
});
}
}

});

Promiseチェーンの値渡し及びPromiseについては(kintone.Promiseとは異なる点もあるかもしれませんが)こちらが参考になるため一読することをおすすめします。

cstap 瀧ヶ平様

分かりやすいご説明ありがとうございます!

kintone.api(params…).then(callback1).then(callback2)で、メソッドをチェーン出来るんですね!この構文を教えて下さったおかげで、他のプログラムも記述も凄く楽になりました!

書き換えて下さったサンプルを元に書き直して見た所、上手く動作をしました!

本当にありがとうございます!

Promiseチェーンの値渡し及びPromiseの参考ページは、各ブラウザの動作チェックもされていて本当に助かりました!

このページを参考にしながら、別のプログラム書き換えていきたいと思います!