毎度お世話になっております。
レコード一覧画面から、レコード全件の更新をかけたいのですが、うまくできません…
下記URLを参考にkintone JavaScript Client (@kintone/rest-api-client)を入れて、設定してみましたが、正しく動作しませんでした。
【kintone】レコードを全件取得する【カスタマイズAPI編】
https://yourkinlife.com/kintone-customize-javascript-api-get-all-records/
ご教示頂けますと幸いですm(_ _)m
(function () {
"use strict";
// ボタンクリックイベントのハンドラ
function handleButtonClick() {
alert("レコード全件を更新します");
kintone.events.on(['app.record.index.show'], async event => {
try {
// クライアントの作成
const client = new KintoneRestAPIClient();
// リクエストパラメータの設定
const params = {
app: kintone.app.getId(), // アプリID
fields: ['$id'], // フィールド
// condition: '日付 >= TODAY()', // 条件
orderBy: '日付 asc', // 順番
withCursor: true // カーソル有無
};
// レコードの全件取得
const resp = await client.record.getAllRecords(params);
for (let i = 0; i < resp.length; i++) {
console.log(resp[i].$id);
}
} catch (e) {
console.log(e);
}
})
}
kintone.events.on("app.record.index.show", function (event) {
// ボタンの作成
const button = document.createElement("button");
button.textContent = "ボタン";
button.addEventListener("click", handleButtonClick);
// レコード一覧画面のヘッダにボタンを追加
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
return event;
});
})();
コードの意味を一つずつ理解していきましょう。
kintone.events.on("app.record.index.show", function (event) {
// ボタンの作成
const button = document.createElement("button");
// 略
button.addEventListener("click", handleButtonClick);
「『レコード一覧画面を開いた瞬間』にボタンを作成する処理」を登録し、ボタンをクリックすると
function handleButtonClick() {
alert("レコード全件を更新します");
kintone.events.on(['app.record.index.show'], async event => {
// 以下略
「『レコード一覧画面を開いた瞬間』にレコードを全件取得する処理」を登録する
という動作になっています。
kintone.events.on~は「処理を行う」のではなく「指定したイベントで処理を行うことを登録する」という意味なので「レコード一覧画面を開いた時にボタンを設置し、ボタンをクリックするとレコード一覧画面で動作する処理を登録する」では動作しないです(厳密にいえばボタン押下後に<>ボタンでページを推移すればイベントが発生するので動きます)。
kintone.events.on~は1つで良いということです。
mls-hashimoto さま
ご回答、ありがとうございます!
kintone.events.on~を1つに修正しました。
しかし、動作しませんでした…
(function () {
"use strict";
// ボタンクリックイベントのハンドラ
async function handleButtonClick() {
try {
// クライアントの作成
const client = new KintoneRestAPIClient();
// リクエストパラメータの設定
const params = {
app: kintone.app.getId(), // アプリID
fields: ['$id'], // フィールド
condition: '日付 >= TODAY()', // 条件
orderBy: '日付 asc', // 順番
withCursor: true // カーソル有無
};
// レコードの全件取得
const resp = await client.record.getAllRecords(params);
for (let i = 0; i < resp.length; i++) {
console.log(resp[i].$id);
alert("レコード全件を更新しました");
}
} catch (e) {
console.log(e);
}
// })
}
kintone.events.on("app.record.index.show", function (event) {
// ボタンの作成
const button = document.createElement("button");
button.textContent = "ボタン";
button.addEventListener("click", handleButtonClick);
// レコード一覧画面のヘッダにボタンを追加
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
return event;
});
})();
Ichiro Saito さま
弊社環境では先ほど投稿されたコードでレコードが取得できているので、フィールドの設定(日付というフィールドがないとエラーになります)かカーソルの問題か、取得できたレコードが0件か(forループの中で「全件…」と書かれているので、取得できたレコードが0件なら何も表示されない可能性があります。逆を言えば100件取得できたら100回「全件…」と表示されるのでalert()はループ外が良いでしょう)何らかの問題があると思います。
コンソールにはどういったエラーが表示されていますか?withCursorを一度外すとエラーが見やすいかもしれません。
「alert(“レコード全件を更新しました”);」100回出てきました!
そして、よくよく見たら・・・・「getAllRecords」は「全件取得」なのですね!?
全件「更新」をかけたかったので、「updateAllRecords」が正解でしょうか?
ただ…getAllRecordsをupdateAllRecordsに置き換えたところ、変化ありませんでした。
また、[更新日時]フィールドを追加しましたが、更新日時は更新されず。
(alert(“レコード全件を更新しました”);も出なくなりました。エラー表示はゼロ)
**■[getAllRecords]を[updateAllRecords]に変更、[更新日時]追加。**
(function () {
"use strict";
// ボタンクリックイベントのハンドラ
async function handleButtonClick() {
try {
// クライアントの作成
const client = new KintoneRestAPIClient();
// リクエストパラメータの設定
const params = {
app: kintone.app.getId(), // アプリID
fields: ['$id'], // フィールド
// fields: ['更新日時'], // フィールド
condition: '日付 >= TODAY()', // 条件
orderBy: '日付 asc', // 順番
withCursor: true // カーソル有無
};
// レコードの全件更新?
const resp = await client.record.updateAllRecords(params);
for (let i = 0; i < resp.length; i++) {
console.log(resp[i].$id);
alert("レコード全件を更新しました");
}
} catch (e) {
console.log(e);
}
// })
}
kintone.events.on("app.record.index.show", function (event) {
// ボタンの作成
const button = document.createElement("button");
button.textContent = "ボタン";
button.addEventListener("click", handleButtonClick);
// レコード一覧画面のヘッダにボタンを追加
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
return event;
});
})();
また、長文で申し訳ないのですが、最終的に実現したいことは、csvファイルで取り込んだファイルに対して、
「更新ボタン」クリックで、下記コードを適用させたいです。
この場合、そもそも「updateAllRecords」は使えないのでしょうか?
■使用フィールドコード
請求年月
請求年月_YYYY年M月形式
(function () {
"use strict";
kintone.events.on([
"app.record.create.show", "app.record.edit.show",
"app.record.create.submit", "app.record.edit.submit",
"app.record.create.change.請求年月",
"app.record.edit.change.請求年月",
], function (event) {
const record = event.record;
const sixDigitNumber = record.請求年月.value; // 6桁の数字が格納されているフィールドのフィールドコード
if (sixDigitNumber && sixDigitNumber.length === 6) {
const year = sixDigitNumber.slice(0, 4); // 最初の4桁を年とする
const month = sixDigitNumber.slice(4); // 最後の2桁を月とする
const newNumber = year + '年' + month + '月'; // 4桁目の後に「年」、6桁目の後に「月」を追加する
record.請求年月_YYYY年M月形式.value = newNumber;
}
return event;
});
})();
■使用フィールドコード
請求社名
担当部門名
担当者名
敬称
請求社名_rep
担当部門名_rep
担当者名_rep
(function () {
"use strict";
kintone.events.on(
[
"app.record.create.show", "app.record.edit.show",
"app.record.create.submit", "app.record.edit.submit",
"app.record.create.change.請求社名",
"app.record.create.change.担当部門名",
"app.record.create.change.担当者名",
"app.record.create.change.敬称"
],
function (event) {
const record = event.record;
//グレーアウト
record.請求社名_rep.disabled = true;
record.担当部門名_rep.disabled = true;
record.担当者名_rep.disabled = true;
//結合パターンその1
if(
record.請求社名.value &&
record.担当部門名.value &&
record.担当者名.value
)
{
record.請求社名_rep.value = record.請求社名.value
record.担当部門名_rep.value = record.担当部門名.value
record.担当者名_rep.value = " " + record.担当者名.value + " " + record.敬称.value
}
//結合パターンその2
else if(
record.請求社名.value &&
!record.担当部門名.value &&
record.担当者名.value
)
{
record.請求社名_rep.value = record.請求社名.value
record.担当部門名_rep.value = record.担当部門名.value
record.担当者名_rep.value = record.担当者名.value + " " + record.敬称.value
}
//結合パターンその3
else if(
record.請求社名.value &&
record.担当部門名.value &&
!record.担当者名.value
)
{
record.請求社名_rep.value = record.請求社名.value
record.担当部門名_rep.value = record.担当部門名.value + " " + record.敬称.value
record.担当者名_rep.value = record.担当者名.value
}
//結合パターンその4
else if(
record.請求社名.value &&
!record.担当部門名.value &&
!record.担当者名.value
)
{
record.請求社名_rep.value = record.請求社名.value + " " + record.敬称.value
record.担当部門名_rep.value = record.担当部門名.value
record.担当者名_rep.value = record.担当者名.value
}
//結合パターンその5
else if(
!record.請求社名.value &&
!record.担当部門名.value &&
!record.担当者名.value
)
{
record.請求社名_rep.value = record.請求社名.value
record.担当部門名_rep.value = record.担当部門名.value
record.担当者名_rep.value = record.担当者名.value
}
return event;
}
);
})();
Ichiro Saito さま
2つ前の投稿までは合っています。作りかけと判断しておりましたが、ご希望されるレコードの更新にはレコードの取得が必須なので、その状態(2つ前の投稿)から更に肉付けしていくことになります。
レコードの更新のためには、更新したいレコードのID、もしくはupdateKey(更新のキーとする重複禁止のフィールド)が必要なので、日付フィールドが今日以降のレコードを全て更新したい場合
①日付を今日以降のレコードで絞り込みしてレコードを取得(getAllRecordsを実行し、レコードを更新するためのIDを取得)
②取得したレコードのIDを使ってupdateAllRecordsを実行
という手順が必要で、2つ前の投稿でこの手順の①ができている状態です。
const resp = await client.record.getAllRecords(params);
for (let i = 0; i < resp.length; i++) {
console.log(resp[i].$id);
}
ここでconsole.log(resp[i].$id)をするのではなく、updateAllRecordsのリクエストボディを作り、そのリクエストボディのrecords配列にresp[i].$idを含めたオブジェクトをpush()していく必要があります。
mls-hashimoto さま
Ichiro Saitoです。
ご連絡大変遅れましたが、ご回答ありがとうございました。
まだ理解できておりませんが・・・時間をかけて勉強したいと思います!
7月で活動終了とのこと・・・今まで大変お世話になりました!!
幸多からんことを願っています!!
「いいね!」 1
system
(system)
クローズされました:
9
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。