一括で別のアプリに登録する

いつもお世話になっております。

一覧で表示したレコードのキーを使用して一括で別のアプリに登録したい を応用したいですが、

「一括登録」が成功した場合⇒ 売上アプリ へ〇〇件登録成功しました。というメッセージで表示し、失敗した場合⇒失敗しました。というメッセージで表示したいです。

今のところ、alert(" 売上アプリ へ登録成功しました。");でメッセージは出ますが、OKボタンを3回押さないと消えないようになっております。

ご教授いただけますようよろしくお願い致します。

(function () {
“use strict”;
kintone.events.on(‘app.record.index.show’, function(event){
var records = event.records;
// ヘッダースペース要素の取得
var headerSpace = kintone.app.getHeaderMenuSpaceElement();
// ボタン要素の作成
var button = document.createElement(“input”);
button.value = “一括登録”;
button.type = “button”;

// ボタンがクリックされた時の処理
var submit = function(){
// レコード一覧のイベントで取得したレコードそれぞれに対して登録の処理を行う
records.forEach(function(data){
// 今日の日付を取得し正規表現で成形
var date = (new Date).toLocaleString().match(/\d+/\d+/\d+/)[0];
// 年月日から四桁の年月(“/“区切り)に変換
var today = date.match(/\d{2}/\d{1,2}/)[0];
// 月が一桁の場合に0を追加
if(//\d$/.test(today)){
today = today.replace(/\d$/,function(str){
return “0” + str;
});
}
// “/“を削除
today = today.replace(///g, “”);
// レコードの共通部分の定義
var record = {
“売上区分” : {“value”: “月契約”},
“売上年月” : {“value”: today},
“内約” : {“value”: “オプション料金”},
“入金予定日” : {“value” : date.replace(/\d+$/, “27”).replace(///g, “-”)}, // 年月日の日付を27日に変更し、”/“を”-“に変換
“税率” : {“value” : “8”} // 税率はパーセントか実数値かで適宜変更してください
};
// レコードそれぞれに対して決定するフィールドを定義
record[“顧客コード”] = data[“顧客コード”];
record[“契約NO”] = data[“契約NO”];
record[“支払方法”] = data[“支払方法”];
record[“商品”] = data[“商品”];
record[“数量”] = data[“数量”];
record[“単価”] = data[“単価”];
kintone.api(kintone.api.url(”/k/v1/record”, true), “POST”, {“app” : 516, “record” : record}, function(res){
// 成功時の処理
alert(” 売上アプリ へ登録成功しました。”);//←←←ここに追加しました。
console.log(“success”);
}
,function(err){
// 失敗時の処理
console.log(“error”);
}
);
});
};
// ボタンをヘッダースペースに追加
headerSpace.appendChild(button);
// ボタンのクリックイベントに処理を登録
button.onclick = submit;
});
})();

goroさん

ループ処理の中で1件ずつPOSTしているため、何回も表示されています。

登録APIは一括登録のAPIも用意されているので、こちらで実装するとアラートが一回で表示されると思います。

https://developer.cybozu.io/hc/ja/articles/202166160#step2

(function() {
'use strict';

kintone.events.on('app.record.index.show', function(event) {
var records = event.records;
// ヘッダースペース要素の取得
var headerSpace = kintone.app.getHeaderMenuSpaceElement();
// ボタン要素の作成
var button = document.createElement('input');
button.value = '一括登録';
button.type = 'button';

// ボタンがクリックされた時の処理
var submit = function() {
// PUTするRecordsを用意する。
var put_records = [];
// レコード一覧のイベントで取得したレコードそれぞれに対して登録の処理を行う
records.forEach(function(data) {
// 今日の日付を取得し正規表現で成形
var date = (new Date).toLocaleString().match(/\d+\/\d+\/\d+/)[0];
// 年月日から四桁の年月("/"区切り)に変換
var today = date.match(/\d{2}\/\d{1,2}/)[0];
// 月が一桁の場合に0を追加
if (/\/\d$/.test(today)) {
today = today.replace(/\d$/, function(str) {
return '0' + str;
});
}
// "/"を削除
today = today.replace(/\//g, '');
// レコードの共通部分の定義
var record = {
'売上区分': { 'value': '月契約' },
'売上年月': { 'value': today },
'内約': { 'value': 'オプション料金' },
'入金予定日': { 'value': date.replace(/\d+$/, '27').replace(/\//g, '-') }, // 年月日の日付を27日に変更し、"/"を"-"に変換
'税率': { 'value': '8' } // 税率はパーセントか実数値かで適宜変更してください
};
// レコードそれぞれに対して決定するフィールドを定義
record['顧客コード'] = data['顧客コード'];
record['契約NO'] = data['契約NO'];
record['支払方法'] = data['支払方法'];
record['商品'] = data['商品'];
record['数量'] = data['数量'];
record['単価'] = data['単価'];

put_records.push(record);

});

var param = {
'app': 70,
'records': put_records
};

kintone.api(kintone.api.url('/k/v1/records', true), 'POST', param, function(resp) {
// success
alert('売上アプリへ登録成功しました。');
console.log(resp);
}, function(error) {
// error
console.log(error);
});
};

// ボタンをヘッダースペースに追加
headerSpace.appendChild(button);
// ボタンのクリックイベントに処理を登録
button.onclick = submit;
});
})();

こんな感じで行けると思います。

HANSA 様

お世話になっております。

早速コードまで回答いただき、誠にありがとうございます。想定してような動きが出来て、本当に感謝しております。

大変恐縮でございますが、①「一括登録」ボタンにアクセス権限与えることは可能でしょうか?ユーザーが誰でも押せたら、大変なことになると思ってまして(汗)②すでに登録があった場合、二重登録を防ぐためになにかよい方法はありますでしょうか?

何度も申し訳ございませんが、ご教授いただければ幸いです。

goroさん

実現できて良かったです^^

①「一括登録」ボタンにアクセス権限与えることは可能でしょうか?ユーザーが誰でも押せたら、大変なことになると思ってまして(汗)

ログインユーザーを取得するJavaScript APIが用意されているので、
ボタンを押したユーザーを判定することができます。

https://developer.cybozu.io/hc/ja/articles/201942024

Administrator(登録を許すユーザー)の情報をあらかじめ用意しておいて、
ログインユーザーと一致判定してあげれば実装可能だと思います。

②すでに登録があった場合、二重登録を防ぐためになにかよい方法はありますでしょうか?

1.POSTする側のアプリにフラグを持たせる。(チェックボックスなどで)
2.POSTする前にフラグがついてないかチェックする処理を入れる。(コメント1のput_records.push(record);の部分の前にでも)
3.POSTしたレコードにフラグを付ける。
4.3のレコードをPOSTする側のアプリにPUT(更新処理)してやる。

で行けると思います。

HANSA 様

お世話になっております。

何度もアドバイスいただき、本当にありがとうございます。まだどこからどう手をつければよろしいか混乱しておりますが、頑張って試してみます。

これからもどうぞよろしくお願い致します。

 

goroさん

①については

var nameArr = ['tanaka', 'suzuki']; // Administratorアカウント名
if(nameArr.indexOf(kintone.getLoginUser().name) == -1){
return event;
}

みたいな感じで行けると思います。

②に関しては、一度実装してみて、ご質問いただければと思います。

HANSA 様

お世話になっております。

再度教えていただき、本当にありがとうございます。

教えて頂いたように追加してみましたが、この2名以外がログインしてもボタンが押せることになってます。

ボタンを押すのはnameArrというコードも追加必要でしょうか?

なにも分からず大変恥ずかしいですが、お時間ありましたら、教えていただけますでしょうか?

var nameArr = ['田中誠一', '田中真一']; // ボタン押すユーザーログイン名

if(nameArr.indexOf(kintone.getLoginUser().name) == -1){
return event;
}

goro さん

コメント1で提示したコードのどの部分に下記のコードを挿入しましたか?

var nameArr = ['tanaka', 'suzuki']; // Administratorアカウント名
if(nameArr.indexOf(kintone.getLoginUser().name) == -1){
return event;
}

こちらのコードは、

nameArrという配列の要素に、ログインユーザーのログイン名が入っていない場合、return eventする。

という内容の処理です。
この動きの場合、ボタンを押した際に上記の処理を発生させるか、そもそもボタンを表示しないようにする必要があります。
前者の場合、ボタンを押した際に動く処理は、button.onclick…の部分です。後者の場合は、ボタンを表示する処理である、appendChild…部分です。
なので、どこに書けばいいかわかるかと思います。

実装頑張ってみてください!

HANSA 様

お世話になっております。何度もご親切に教えていただき、本当にありがとうございます。

以下のコードで想定された動きができました。本当にありがとうございました。

これからもどうぞ宜しくお願い致します。

(function() {
‘use strict’;

kintone.events.on(‘app.record.index.show’, function(event) {
var records = event.records;
// ヘッダースペース要素の取得
var headerSpace = kintone.app.getHeaderMenuSpaceElement();
// ボタン要素の作成
var button = document.createElement(‘input’);
button.value = ‘一括登録’;
button.type = ‘button’;

// ボタンがクリックされた時の処理
var submit = function() {
// PUTするRecordsを用意する。
var put_records = [];
// レコード一覧のイベントで取得したレコードそれぞれに対して登録の処理を行う
records.forEach(function(data) {
// 今日の日付を取得し正規表現で成形
var date = (new Date).toLocaleString().match(/\d+/\d+/\d+/)[0];
// 年月日から四桁の年月("/"区切り)に変換
var today = date.match(/\d{2}/\d{1,2}/)[0];
// 月が一桁の場合に0を追加
if (//\d$/.test(today)) {
today = today.replace(/\d$/, function(str) {
return ‘0’ + str;
});
}
// "/“を削除
today = today.replace(///g, ‘’);
// レコードの共通部分の定義
var record = {
‘売上区分’: { ‘value’: ‘月契約’ },
‘売上年月’: { ‘value’: today },
‘内約’: { ‘value’: ‘オプション料金’ },
‘入金予定日’: { ‘value’: date.replace(/\d+$/, ‘27’).replace(///g, ‘-’) }, // 年月日の日付を27日に変更し、”/“を”-"に変換
‘税率’: { ‘value’: ‘8’ } // 税率はパーセントか実数値かで適宜変更してください
};
// レコードそれぞれに対して決定するフィールドを定義
record[‘顧客コード’] = data[‘顧客コード’];
record[‘契約NO’] = data[‘契約NO’];
record[‘支払方法’] = data[‘支払方法’];
record[‘商品’] = data[‘商品’];
record[‘数量’] = data[‘数量’];
record[‘単価’] = data[‘単価’];

put_records.push(record);

});

var param = {
‘app’: 516,
‘records’: put_records
};

kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘POST’, param, function(resp) {
// success
alert(‘売上アプリへ登録成功しました。’);
console.log(resp);
}, function(error) {
// error
console.log(error);
});
};

// ‘use strict’;
var nameArr = ['‘田中誠一’, ‘田中真一’]; // ボタン押すユーザー
if(nameArr.indexOf(kintone.getLoginUser().name) == -1){
return event;
}
else{
// ボタンをヘッダースペースに追加
headerSpace.appendChild(button);
}
// ボタンのクリックイベントに処理を登録
button.onclick = submit;
});

})();

HANSA

お世話になっております。

横から失礼いたします。

この投稿が大変勉強になっております。ただ初心者のもので、応用したいですが、うまくできなくて・・・

一括登録(アプリ自身に)ボタンについて にて、投稿しております。もしお時間など許すであればアドバイスなど頂けたら幸いです。

どうぞよろしくお願いいたします。