cli-kintoneでサブテーブル上のデータを空欄化,削除したい

cli-kintoneを使って、csvからサブテーブル上のデータを空欄化(削除)したい

下記の環境でcli-kintoneを使ってkintoneデータ(サブテーブルを含めた)のRead/Writeをしています。
その中で前回Writeしたサブテーブルのデータを個別に削除する必要が出てきたのですが、うまく削除できません(無視される、履歴に残らない)。
なにか気がつことがあればご教授ください。

環境とやったこと

Windows11 cmd.exeでのbatchによるcli-kintone.exe @version1.14.0を利用
(1)cli-kintoneとcsvを使ってサブテーブルへの各項目へのデータ書き込み、データを伴った更新はできています。
(2)すでに書き込まれているデータに対して、データを個々に削除をして空欄化したいのですが、csvに ,“”, や,としても無視(履歴も残らない)されてしまいます。

実行例

#動くcsv(新規、修正データを伴った更新)
「受付番号」は親のUniqKey、
「状況」はサブテーブルのUniq_ID名、
「状況名」はサブテーブルの項目名

"*","受付番号","状況","状況名"
"*","CL24-087","1662519","あああ"
"","CL24-087","1662797","いいい"
#→「あああ」、「いいい」はkintone上に書き込まれている

「状況名」の項目データを削除したく、""などを記載してみる

"*","受付番号","状況","状況名"
"*","CL24-087","1662519",""
"","CL24-087","1662797",
#どちらもエラーにはならず無視?される(履歴にも残らない)

以上、なにか参考になるようなことがあればご教授いただければ幸いです。
よろしくお願いいたします。

過去ログに似たような話題がありました。

ご参考まで

aaaさん、ご連絡ありがとうございます。
やはり仕様上できないのですね、、、。勉強になります。
" “(半角スペース)もやってみたのですが、前回との差分でUpdateしようとすると今度は、その項目が"0"と返ってくるのでそれをescapeをしないといけないし、ドロップダウン項目も引っかかるのでどうしたものかと思っていました。
確認したところ、挙動的には、更新した後でcli-kintoneでexportしたデータを見ると、
→ドロップダウン項目は、” “(半角スペース)で更新することで「空欄」になる
→一般の記載項目は、” “(半角スペース)で更新すると” "(半角スペース)が返ってくる(→当初「“0"が返ってくる」と書いていましたが、「” "(半角スペース)が返っていくる」の間違いです。修正します@20250327)と異なるようです。これで作るしかない、ということですね。

kintoneコマンドラインツール(cli-kintone) - cybozu developer network には、

テーブルのあるレコードを追加または更新する

標準機能のファイル書き出しと同じように、テーブルのデータごとに、1レコードの内容を複数行に分けて記載します。
ファイルの先頭列の「」から次の「」の前までの行が、1つのレコードのデータを表します。

ファイルの先頭列は、「」という項目名にします。
各レコードのデータの開始行の先頭列には「
」を記載し、それ以外は空にします。

注意

既存のレコードのテーブルを更新する場合の注意点

  • データを変更しないテーブルの行があっても、CSVファイルにはすべての行データを記載してください。
    ファイルに記載していない行データは削除されます。
  • データを更新しないテーブルのフィールドがあるときは、次のどちらかを> 行ってください。
    行わない場合、ファイルに記載されていないテーブルのフィールドの値は空> になります。
    • 行のIDを記載する。
      行のIDは、record exportを使ってテーブルのデータを表示したときのテーブルフィールドの値で確認できます。
    • テーブルに含まれるすべてのフィールドのデータを記載する。

とあるのですが、““で更新をかけると、もとのデータに影響を与えない、書き変わらないので、この記載の仕様は合っていないような気がします。リンク先には「cli-kintoneでは、テーブル内フィールドの更新値が全て””(空文字)の指定となっている場合、更新対象(kintone REST APIへのリクエスト対象)に含めない仕様としております。」とありますので、そういう仕様ということなのですね。

  1. 少し話はそれますが、cli-kintoneを使わずにkintoneのwebからCSVをダウンロードして、csvを編集してサブテーブル内の項目を空にして再度読み込ませると空になって反映されるようです。

  2. cli-kintoneはgithubで公開されており、コードを書き換えて、バイナリ生成もできるようです。サブテーブルのフィールドの値の lengthが 0より大きいかで確認している部分が怪しいのではないかと考えています。

  3. また、cli-kintoneはサポート対象なので、問い合わせが可能です。

「いいね!」 1

cli-kintoneで再現しようとしているのですが、うまくいきません。

空白で上書きできてしまいました。

*,"レコード番号","テーブル","文字列__1行__1"
*,"1","703597","1534"
,"1","703599",""

質問者のレコードはどのようになっているのでしょうか?

「受付番号」は親のUniqKey、
「状況」はサブテーブルのUniq_ID名、
「状況名」はサブテーブルの項目名

という部分が理解できませんした。

「いいね!」 1

色々とご丁寧にfollowしてくださり、ありがとうございます。サポート対象とのことだったので、担当に依頼してそちらからも聞いています。

キャプチャをはろうとしたら、

エラーが発生しました: 新規ユーザーは、ポストにつき 1 個のメディア項目しか埋め込めません。

ということで、一枚しか貼れないようなので、わかりにくくてすみません

一箇所修正です。最初の書き込みで、

→一般の記載項目は、" "(半角スペース)で更新すると"0"が返ってくる

は、" “(半角スペース)が返ってくる、の間違いでした(VScode/Excel_Viewerがそういう表示をしているだけで、実際には” "(半角スペース)でした)。訂正します。

さて、私も別に組んでやってみました。やはり""(スペース無し)では文字列の部分は消えませんでした。
cli-kintoneはv1.14.0です。

親の「受付番号」に、「状況」(サブ)テーブルとテーブル項目に「状況名」と「ドロップダウン」の構成です。親には「受付番号」に「あ1」と「い1」があります。

それをexportしたcsv↓ (fieldsで"受付番号"とサブテーブル名の"状況"を指定)

*,"受付番号","状況","状況名","ドロップダウン"
*,"あ1","1664820","A1","sample1"
,"あ1","1664821","A2","sample2"
*,"い1","1664964","B1","sample1"

これをA1とsample2を削除、空欄化しようとして以下のcsvをimportする

*,"受付番号","状況","状況名","ドロップダウン"
*,"あ1","1664820","","sample1"
,"あ1","1664821","A2",""
*,"い1","1664964","B1","sample1"

結果変わらず。変更履歴にも残らない。

今度は、" "(スペース1文字挿入)をしてみる (先のリンク先の情報)

*,"受付番号","状況","状況名","ドロップダウン"
*,"あ1","1664820"," ","sample1"
,"あ1","1664821","A2"," "
*,"い1","1664964","B1","sample1"

所望の部分が消えているように見える。
これをexportしてみると

*,"受付番号","状況","状況名","ドロップダウン"
*,"あ1","1664820"," ","sample1"
,"あ1","1664821","A2",
*,"い1","1664964","B1","sample1"

A1の文字列の部分には" "(スペース)、sample2のドロップダウンの部分はnull?が返ってきているように見えます。
先にaaaさんが書いてくださったリンク先の情報と符合しているようです。

とりあえず、時間もないのでプログラム側で上記仕様で動くように修正しました。サポートからの情報が来たら追って共有させて頂きます。

「いいね!」 1

サポートに詳細手順をつけて確認をしましたが、aaaさんと同様に""でテーブル内のフィールド値を削除することが可能であった、との報告が来ました。
とりあえず対応はできているのと時間が無いので今後環境なども含めて再度切り分けをしてみたいと思います。
以下、現時点でわかったことを共有します。

  • CSVファイルの行データに " "(半角スペース)を入れて、インポート処理を実行した場合には、上記記載の動作となる
  • aaaさんからお知らせ頂いた「kintone コマンドラインツールでテーブルを初期化する方法 - Legacy_Account2722 の #4 」の回答については、「kintone」コマンドラインツール v0 についての情報。そこに記載の動作については、外部仕様として定めていないため、今後、仕様が変更される可能性もあるので留意が必要

以上、今後再度切り分け等が必要ですが、解決に向けてaaaさんにはご協力頂き感謝いたします。ありがとうございました。

「いいね!」 2
  1. 状況からして質問者の環境によるものという可能性が高いと思われます。
  2. 書き換え前と後で同じデータの場合、REST API経由で更新しても更新履歴に残りません。
    この場合はkintone詳細画面の変更履歴には表示するものがないため無視されますが、レコードの更新日時が更新され、revision番号が上がっています。
  3. [cybozu.com 共通管理]-[監査ログの閲覧とダウンロード]でAPIの実行が記録されているはずです。
  4. csvファイルの破損、意図しない変更なども可能性としてはあるのではないかと考えました。

わかりました!
大変申し訳ありません。私のミスでした!

当初以前使っていた環境をそのまま使っていて、今回こちらへ相談するにあたりversion問題はないか、と確認をしました。1.7.0→1.14.0に上がっていたのでupdateし、再度検証をしてだめだったのでこちらにご相談しました。
import用とexport用のbatchを組んでいたのですが、import用のbatchの中のcli-kintoneを呼ぶところで、.\cli-kintoneとしていたものが、..\cli-kintoneとしてしまっており、悪いことに一つ上のdirectoryに1.7.0があって、importする時にそれを読み込んでいた、ということでした。1.14.0を使って検証し、確かにTable空データが削除されていることを確認しました。

cli-kintoneの1.7.0から1.14.0のどこかのversion移行で、Tableに対する""のimportの動作が「無視」から「削除」に変わっていた、という事になります。

aaaさん、本当に解決に向けご尽力頂きありがとうございました。心から感謝いたします。
ありがとうございました。

「いいね!」 3
  1. 今見ると
    Release Release cli-kintone v1.10.7 · kintone/cli-kintone · GitHub

:warning: BREAKING CHANGES

  • The behavior for an empty string inside the Table field changed (#630 )

って書いてありましたね。

  1. もしかしてv0にパスが通ってしまっているのかなと想像したのですが引数の指定方法が違うので可能性は低いかなと思っていました。
  2. こういうハマってしまうことを防ぐには、自身の環境の問題かどうかを確認するために使っていない共有端末などで試してみたりするのもいいのかなと思いました。コメントで質問者は「今回は時間がないので」と書かれており、回避策も既にあり、時間がかかってしまったのかもしれません。余裕・休憩・切り分けが重要だと学習しました。
「いいね!」 2

aaaさん、後で調べようと思ってはいたんですが、早速調べてくださってありがとうございます。v1.10.7で変わったんですね。

Field inside Table

  • If the field is an undefined/empty string, add/update with an empty string (changed!!)
  • If all fields in the row are undefined/empty string, ignore the row.

この2行目も影響がありました。「前と同じ」という先入観があったので、前は更新されたrowだけ記載すればよかった(はず)なのですが、残すrowを全部記載しないとバッサリ消えたりして、これはcli-kintoneのページに囲みに書いてありますが、当初(v1.7.0のとき)は記載の動作とは違うなと思っていました。v1.14.0にした途端に色々変わっちゃったように見えたのでどこかで動作が大きく変わったのかな、その時点で認識しました。

今回の私の教訓?は、

教訓: 開発するときには、「前と同じという先入観は捨てて」、環境は必ず最新化してから

です。本当に色々とご丁寧に解決に向けてご助言頂きありがとうございました!

「いいね!」 2

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。