はじめに
コメントの取得と投稿と削除ができるAPIを使えば、コメントのバックアップとリストアが可能です。
万が一の事態でもkintoneのアプリを元の状態に復元できるように、kintone上のレコード情報とコメント情報をお手元のPCに保存(バックアップ)して、それを別のアプリに復元(リストア)します。
完成イメージ
バックアップ側のアプリ
一覧
詳細
リストア側のアプリ
一覧
詳細
コメントリストアのコツ
ポイント(1) リストア先のレコードIDを事前に知る必要がある
APIからリストアされたレコードには新しいIDが割り振られるため、投稿先のレコードIDが変わってしまいます。
このような場合、レコードのリストア完了時にレコード投稿APIが返してくれるレコードIDの一覧と、バックアップしたコメントデータを対応させ、新レコードIDの方にコメントを投稿します。
ポイント(2)メンション情報付きコメントの再現
コメント投稿APIでは、コメントの宛先となるユーザーを指定(メンション)できます が、メンション情報付きコメントをコメント投稿APIを通じてそのままリストアすると、 宛先ユーザーに通知が送られてしまいます。
宛先ユーザーは@が外れた文字列として名前が本文中に入るので、リストア時に宛先ユーザーへの通知を避けたい場合はこちらで代用します。
ポイント(3)コメント投稿者名の再現
APIで投稿したコメントの投稿者は、APIログインに使ったユーザーになります。コメント本文中に投稿者名を加えるなどの対応がリストア時に必要になります。
ポイント(4)投稿時刻の再現
APIによるコメントの投稿日時は再投稿時の日時になります。これは変更できないので、本文中に投稿時刻を埋め込んでリストアすることで回避します。
バックアップ時、時刻はUTCの文字列で届くので、日本時間に直してリストアします。
例)バックアップ元のコメント
例)リストア先のコメント
サンプル実行方法
バックアップ元アプリの設定
サンプルコード sample_1.js をバックアップするアプリに読み込ませます。
レコードのバックアップ
一覧画面のバックアップボタンをクリックして、レコードとコメント両方のバックアップデータをダウンロードします。
リストア先アプリの作成
バックアップ元のアプリをコピーして、同じアプリを作成します。
ビュー作成
バックアップファイルを読み込むためのフォームを作成します。kintoneのレコードの一覧の表示形式を「カスタマイズ」にして、以下のHTMLを記述します。
[sample_form.html]
カスタマイズJS導入
サンプルコード sample_2.js と、jQueryのjsファイル(Cybozu CDN)を、リストア先のアプリに読み込ませます。
※文字化けする可能性があるため、右クリックし、直接ダウンロードしてください。
- sample_2.js
- https://js.cybozu.com/jquery/3.2.0/jquery.min.js
リストア
リストア先のアプリの一覧画面に移動して、先ほど作成したカスタマイズビューを開きます。
レコードとコメントそれぞれの、先ほどダウンロードしたバックアップデータを読み込ませます。
読み込みに成功すると、ファイル選択部分の下のテキストボックスに、読み込んだファイルの内容が表示されます。
レコードとコメントの両方を読み込んだら、リストアボタンを押せば、レコードとコメントの両方がリストアされます。一覧画面に戻ってリストアに成功したことを確認することができます。
サンプルコードの解説
レコードのバックアップ
kintone APIを利用して、バックアップ元からレコードデータを取得します。
[sample_1.js]
コメントのバックアップ
コメントデータの一括取得
コメント取得のAPIでは一度に10個までしか取得できないので、再帰処理で全件取得します。また、コメント取得順に「昇順(asc)」を指定します。
取得したデータの加工
プログラム内で使う配列をそのままファイルに書き込んで(JSON形式で)保存します。
[sample_1.js]-[save-records-and-comments]
バックアップされたデータの読み込み
ユーザーが指定したバックアップファイルを、「リストア」ボタンが押されたタイミングに読み込みます。
[sample_2] - [read-data]
レコードのリストア
レコードのリストアに成功すると、登録されたレコードIDの配列などを保持したオブジェクトが返ってきます。この新IDの配列を利用して、コメントをリストアします。
[sample_2.js] - [restore-record]
コメントのリストア
リストアするコメントの整形
上記ポイント(2)、(3)、(4)に対処します。コメントをリストアするためにmentionsを削除し、日付を追加して、元の投稿者名を入れる処理をしています。
[sample_2.js] - [build-comments]
リストアするコメントデータを探す
バックアップデータの中身は、元のレコードIDをインデックス、そのレコードの全コメントを値とする配列になっていました。
レコードのリストア後に新しいレコードIDを受け取ることができるので、「旧ID」「新ID」「旧IDに対応するコメントデータ」を使って、新IDに対してコメントをリストアします。
[sample-2.js] - [find-comments]
コメントの投稿
コメントのリストアは、レコードのリストア完了後に処理します。レコード投稿API(非同期処理)のコールバックに、コメントのリストアのコードを記述しましょう。
postCommentsは、レコードに対して複数コメントをリストアするための関数です。コメント投稿APIでは一度に一つしか投稿できないため、ループ処理しています。
[sample_2.js] - [post-comments]
最後に
以上でレコードとコメントのバックアップとリストアができました。新しいAPIを使えば、これまでできなかったコメントの操作が色々と便利になりそうです!
サンプルコード
※文字化けする可能性があるため、右クリックし、直接ダウンロードしてください。
サンプルコードの制限事項
- 「ファイル」や「計算」のフィールドがあるデータでは動作しません。
※リストア側の計算フィールドにもバックアップアプリに使われた数値フィールドと計算式を入れれば使用可能です。(文字列の計算フィールドも同様) - 今回のサンプルでは、バックアップ時/リストア時、ともに全てのデータを一度にメモリに読み込んでいます。レコード数が多いアプリでは動作が難しくなります。
参考記事
getCommentsDataのreturnの resp.older の値が、常に false になっています(コメント数が10個より多い場合でも)。
APIの不具合だと思うのですが、ご対応完了までにどれくらいかかりそうでしょうか?
resp.older の部分を resp.newer とすることで 10個より多い場合でも取得できました!
佐藤 様
お世話になっております。cybozu developer network事務局です。
こちら動作確認をいたしましたが、佐藤様の記載いただいた挙動は確認できませんでした。
レコードコメントの一括取得 のドキュメント、「レスポンス」部分に記載がある通り、
resp.older の値は、取得したコメントIDより前のコメントがあるかどうかの情報で、取得したコメントID以前のコメントがある場合、trueとなります。
ご確認を宜しくお願い致します。
sample_2.jsを利用して、レコードとコメントをインポートしようとしたところ、javascriptエラーが発生してしまいました。
山口 優様
お世話になっております。
cybozu developer network 運営局です。
このエラーは、kintone 外からの通信や kintone.api() を使ったリクエスト(例:XMLHttpRequest()で認証情報を付与してリクエストしない場合に
発生するエラーです。
このコードだと、kitnone.api() を使っているのでエラーにならない想定なのですが、
このアプリに対して、他のカスタマイズを適用されていたりしますでしょうか?
開発者ツールで、エラーメッセージが表示されるかと思うのですが、その右隅に download.xxxx と言った文字リンクが出ていると思います。
そのリンクをクリックすると、エラーが出たソースコードが表示されるはずなので、それで sample_2.js が表示されるか確認していただけないでしょうか?
cybozu developer network 運営局様
お世話になっております。山口です。
早速のご連絡ありがとうございます。
質問を投稿させて頂いた後、設定情報などを確認していたところ、設定の「APIトークン」を見つけ、
APIトークンの生成と合わせ、レコード追加の権限も付与したところ、エラーが出なくなりました。
kintone.apiを利用する場合の前提条件を理解しておらず申し訳ありませんでした。
山口 優様
お世話になっております。
cybozu developer network 運営局です。
解決したとのこと、承知いたしました。
よろしくお願いいたします。