Docly Child

kintoneのテーブルに行を追加する

73 views
kintoneとの連携設定

※本ページの紹介内容をワークフローに実装するためには、事前にkintoneとの連携設定を済ませておく必要があります。 連携設定の方法はこちらをご参照ください。
kintoneと連携

※更新できないフィールド

仕様により、以下のフィールドは更新ができません。

  • ルックアップ元からコピーされるフィールド
  • 計算
  • 作成者
  • 自動計算が設定されている文字列(1行)フィールド

 kintoneのテーブル

kintoneでは、1つのレコード内で複数の関連するデータを管理する機能として、テーブルフィールド(サブテーブル)が用意されています。この機能を使用すると、レコードの中に表を持たせることができます。

具体的な使用例としては、「1つの商談レコードの中に、その商談相手に対する営業活動の履歴を日付ごとにまとめたテーブルを持たせる」などが考えられます。

当記事では、kintoneの「テーブル」に対して1行を下に追加する方法をいくつか紹介します。

 テーブルに1行を追加する

既存のサブテーブルの下部に1行を追加する、最も単純な例を紹介します。

■活動履歴テーブルにレコード(行)を追加
・日付:2024-04-10
・活動内容:訪問
・メモ:飛び込み

まずは、追加対象のテーブルの親となるアプリやレコードがどれになるかを設定します。

  • テーブルにレコードを追加する(kintoneAddRecordToTable)を設定します
  • プロバイダーIDを右端のアイコンから設定します
  • アプリIDを右端のアイコンもしくは手入力で設定します
  • 任意のレコードのIDを入力します

テーブルに追加する内容を設定します。

  • テーブル名欄に、右端のアイコンから追加対象のテーブルを設定します。
  • テーブルに書き込むレコード欄に、右端のアイコンから追加するレコードの内容を設定します

 

※弊社テスト環境のアプリで使用した例となります。実際の設定内容はアプリにより異なります。
# テーブルにレコードを追加する
+kintone_add_record_to_table_1:
  action>: kintoneAddRecordToTable
  provider: 
  appId: 
  recordId: 1
  tableName: '活動履歴'
  tableRecord:
    日付:
      value: '2024-04-10'
    活動内容_0:
      value: '訪問'
    滞在メモ:
      value: '飛び込み'
  clearTableRecords: false
  private: false
  meta:
    display:
      provider:
        type: chip
        label: 'kintone (example.cybozu.com)'
        icon: kintone
      appId:
        label: '商談履歴サブテサンプル'
        icon: kintone
        type: chip

 テーブルに複数行を追加する

ここではスプレッドシートの情報をkintoneのテーブルに転記する例を紹介します。

サンプルはスプレッドシートになりますが、ExcelやCSVでも同じことができます。

まずは、転記したい情報が記載されたスプレッドシートを取得します。

  • 既存のスプレッドシートを取得(GetSpreadSheet)を設定します
  • プロバイダーIDは、右端のスプレッドシートアイコンから設定します
  • スプレッドシートIDは、スプレッドシートのURLを貼り付けるか、もしくは右端のスプレッドシートアイコンから任意のスプレッドシートを選択します

テーブルに追加する情報を取得します

  • GetCells(セルの値を取得)を設定します。
  • 範囲には、テーブルに追加したい情報が記載されているシートからヘッダーを除いた範囲を設定します(ここではシート1!A2:Mとします)
  • 範囲内の空白セルを全て取得する(findAll)をONにします

 

取得した行をテーブルに追加していくために、繰り返し処理を設定します

  • 各要素について繰り返す(forEach)を設定します
  • 繰り返すリストには、2のGetCellsのアウトプットを指定します。
  • 要素を格納する変数名はtableRowとします。

取得したシートの情報を「どのレコード(ID)の、どのテーブルに追加するか?」を下記の通り設定します。

どのレコード(ID)に追加するか?シートのA列(レコードID)
どのテーブルに追加するか?滞在先テーブル

まずはテーブルから設定していきます。

  • kintoneAddRecordToTable(テーブルにレコードを追加する)アクションを設定します
  • プロバイダーIDは、右端のkintoneアイコンから指定します
  • アプリIDは、右端のkintoneアイコンから選択するか、アプリIDの直打ちで指定します
  • テーブル名は、右端のkintoneアイコンから選択するか、テーブルのフィールドコードを直打ちします。

  • レコードIDには以下を設定します。A列の値は今回は[0]で呼び出せます。

${tableRow[0]}

シートの各列の情報を、kintoneのテーブルのどのフィールドに入れるか?を指定してきます。 4では、レコードIDをシートのA列から${tableRow[0]}とすることで呼び出しました。この[0]は、ステップ2のセルの値を取得で指定した範囲の起点列を0とする列番号となります。 これと同様に、滞在地、滞在開始日、滞在終了日、メモをkintoneに転記していきます。
列名 列アルファベット 列番号
レコードID A 0
タイトル B 1
滞在地 C 2
滞在開始日 D 3
滞在終了日 E 4
費用 F 5
添付ファイル G 6
メモ H 7
  • 「テーブルに書き込むレコード」欄の右端のアイコンをクリックします
  • 表示されたモーダルの+ボタンをクリックして、項目を追加していきます
  • モーダルのfieldをプルダウンから選択し、valueには対応する値を入力していきます

テーブルの親レコードのIDがシートなどに無い場合は、何らかの方法で親レコードのIDを特定する必要があります。

今回の例であれば、kintoneのタイトルフィールドが他と重複しないようになっていれば、シート上のタイトル(B列)からレコードIDを割り出せます。

このようなIDの特定作業は、kintoneGetRecordアクションや、ブラウザ系アクションで起動したkintoneからできる場合が多いです(利用者の環境によります)

参考:kintoneのレコードを取得

※弊社テスト環境のアプリで使用した例となります。実際の設定内容はアプリにより異なります。

# 既存のスプレッドシートを取得
+get_spreadsheet_1:
  action>: GetSpreadsheet
  provider: ''
  spreadsheet_id: ''
  private: false
  meta:
    display:

# セルの値を取得
+get_cells_1:
  action>: GetCells
  spreadsheet: +get_spreadsheet_1
  range: 'シート1!A2:M'
  findAll: true
  private: false

# 各要素について繰り返す
+for_each_1:
  for_each>:
    tableRow: +get_cells_1
  _do:

    # テーブルにレコードを追加する
    +kintone_add_record_to_table_1:
      action>: kintoneAddRecordToTable
      provider: kintone_ffd168138e4f42b6c169
      appId: ''
      recordId: ${tableRow[0]}
      tableName: '滞在地テーブル'
      tableRecord:
        滞在地:
          value: ${tableRow[2]}
        滞在開始日:
          value: ${tableRow[3]}
        滞在終了日:
          value: ${tableRow[4]}
        滞在メモ:
          value: ${tableRow[7]}
      clearTableRecords: false
      private: false
      meta:
        display:
          provider:
            type: chip
            label: 'kintone (example.cybozu.com)'
            icon: kintone

 AUTOROで作成したkintoneレコードにテーブルを追加する

kintoneに、中身の入ったテーブルを含んだ状態のレコードを1件作成したい場合、kintoneCreateRecord(レコードを1件作成する)アクションだけではテーブルへのレコード追加ができません。

このようなケースでは、以下の手順で「テーブルを追加したいレコードのID」を割り出す必要があります。

  • kintoneCreateRecordアクションでレコードを作成
  • レコードIDの降順でレコードを取得
  • 最新のレコードIDを取り出し
  • 取り出したレコードIDをkintoneAddRecordToTable(テーブルにレコードを追加)アクションのレコードIDに指定

以下より詳細な方法を紹介します

テーブルの追加先となるレコードを新規作成します。

  • kintoneCreateRecordアクションを設定します
  • プロバイダID,アプリID,レコードを設定します

1で作成したばかりのレコードのIDを取得します。

  • kintoneGetRecordsアクションを設定します
  • 1と同じプロバイダID,アプリIDを設定します
  • アクションの詳細設定を開きます
  • フィールドに["$id"]と指定します。
  • クエリに以下を指定します。意味はレコードIDの降順でレコードIDを5つ取得、となります
    order by $id desc limit 5

最新のレコードからIDを抜き出します

  • GetItemFromList(リストから要素を取得)を追加します
  • リストに2のアウトプットを指定します
  • インデックスを半角数字の0にします
  • GetValueWithKey(オブジェクトのキーの値を取得)を設定します
  • オブジェクトにGetItemFromListのアウトプットを指定します
  • キーを$idにします

  • kintoneAddRecordToTable(テーブルにレコードを追加)を設定します
  • レコードIDに3のアウトプットを指定します。
  • 1と同じプロバイダID,アプリIDを設定します
  • テーブル名,テーブルに書き込むレコードを任意に設定します

 

※弊社テスト環境のアプリで使用した例となります。実際の設定内容はアプリにより異なります。
# レコードを1件作成する
+kintone_create_record_1:
  action>: kintoneCreateRecord
  provider: ''
  appId: 51
  record:
    タイトル:
      value: 'トリポリ'
  private: false
  meta:
    display:

# レコードを一括取得する_id降順,先頭3件
+kintone_get_records_1:
  action>: kintoneGetRecords
  provider: ''
  appId: 51
  fields: ["$id"]
  query: 'order by $id desc limit 5'
  private: false
  meta:
    display:

# リストから要素を取得_最新のレコード
+get_item_from_list_1:
  action>: GetItemFromList
  list: +kintone_get_records_1
  index: '0'
  private: false

# オブジェクトのキーの値を取得_最新のレコードID
+get_value_with_key_1:
  action>: GetValueWithKey
  object: +get_item_from_list_1
  key: '$id'
  private: false

# テーブルにレコードを追加する
+kintone_add_record_to_table_1:
  action>: kintoneAddRecordToTable
  provider: ''
  appId: 51
  recordId: +get_value_with_key_1
  tableName: ''
  tableRecord: ''
  clearTableRecords: false
  private: false
  meta:
    display:

 参考:JavaScriptを使用してテーブルにレコードを追加する

2024年4月以前はkintoneAddRecordToTableアクションがなかっため、JavaScriptを使用した方法を別のページにて紹介しておりました。

その際に記載していた、JavaScriptを使用した2つの方法をこちらに残しておきます

  • HTTPRequestアクションを使用する
  • InjectScriptアクションを使用する

今回は例として、以下のレコードを新規作成してみます。

  • サブテーブルの「おやつ代」が「350」
  • サブテーブルの「交通費」が「20000」
  • サブテーブルではない「都道府県」が「東京都」
  • RunScriptアクションを設定します。
  • サブテーブルを含むレコード1件を、kintoneで定められた形式で記述します。
  • アプリIDを、新たにレコードを作成したいアプリのID(半角数字)に変更します。
  • StoreValueアクションを追加します。
  • 変数名は任意とします。
  • 値にRunScriptアクションのアウトプットを指定します。

参考:レコードの登録(POST) リクエストボディの構造部を参照
参考:レコード更新におけるテーブル操作のテクニック(登録においても有用です)

  • kintoneから、レコードを新規追加したいアプリの設定画面を開きます。
  • 「設定」タブから、「APIトークン」をクリックします。

  • APIトークンが存在しない場合、「生成する」をクリックします。
  • APIトークンのアクセス権を設定します。
  • 画面左上の「保存」をクリックします。

  • 「アプリを更新」をクリックします。

  • HTTPRequestアクションを設定します。
  • 「URL」を以下とします。
    https://サブドメイン名.cybozu.com/k/v1/record.json
  • リクエストボディを以下とします。
    ${1で作成した変数名}
  • 「リクエストメソッド」をPOSTとします。
  • 「ヘッダ」を以下とします。
    {"X-Cybozu-API-Token":"2でコピーしたAPIトークン"}

サブテーブル更新のためにInjectScriptアクションを使用する場合、InjectScriptアクションの前に、OpenBrowserアクションからkintoneにログインしておく必要があります。

InjectScriptアクション内部では、kintone REST APIのJavaScriptをそのままご使用いただけます。


加えて、InjectScript内部のスクリプトでasync/awaitを使用すると、kintone REST APIからのレスポンスを出力できます。(参考リンク)

実際のワークフロー例は、下記のワークフロー実行結果のうち「InjectScript(kintone REST API)」タブをご参照ください。

※ログインするユーザーには、該当アプリのレコードを編集する権限が必要です。(参考リンク
※InjectScriptを使用する場合は、HTTPRequestで必要なAPIトークンの発行は不要です。(参考リンク
※kintoneにIPアドレス制限がされている場合は、制限を解除頂くか、AUTOROオプションの固定IPサービスをご利用ください(参考リンク

# スクリプトを実行_レコードを生成
+run_script_1:
  action>: RunScript
  code: "return {\n  app: アプリID,\n  record: {\n    都道府県: { value: \"東京都\" },\n    費用: {\n      value: [\n        {\n          value: {\n            おやつ代: {\n              value: 350\n            },\n            交通費: {\n              value: 20000\n            }\n          }\n        }\n      ]\n    }\n  }\n};\n"

# 変数に保存
+store_value_1:
  action>: StoreValue
  key: reqBody
  value: +run_script_1

# HTTPリクエスト
+h_t_t_p_request_1:
  action>: HTTPRequest
  url: 'https://サブドメイン名.cybozu.com/k/v1/record.json'
  params: ${reqBody}
  method: POST
  headers:
    X-Cybozu-API-Token: '2で発行したAPIトークン'
  multipart: false
# スクリプトを実行_レコードを生成
+run_script_1:
  action>: RunScript
  code: "return {\n  app: アプリID,\n  record: {\n    都道府県: { value: \"東京都\" },\n    費用: {\n      value: [\n        {\n          value: {\n            おやつ代: {\n              value: 350\n            },\n            交通費: {\n              value: 20000\n            }\n          }\n        }\n      ]\n    }\n  }\n};\n"

# 変数に保存
+store_value_1:
  action>: StoreValue
  key: reqBody
  value: +run_script_1

# ブラウザを開く_kintoneログイン画面
+open_browser_1:
  action>: OpenBrowser
  url: 'https://サブドメイン名.cybozu.com'
  lang: 'ja-JP'
  timeZone: 'Asia/Tokyo'
  headless: true
  windowSize: '1920 x 1080'
  useShadowDomSelector: false

# 文字入力_ユーザーID
+type_text_1:
  action>: TypeText
  browser: +open_browser_1
  selector: '#username-\3A 0-text'
  text: 'ユーザーID'
  clearValue: false
  ignoreError: true

# パスワード入力
+type_password_1:
  action>: TypePassword
  browser: +type_text_1
  selector: 'input[type=password]'
  password: ''
  ignoreError: true

# キーを送信_ログイン
+send_keys_1:
  action>: SendKeys
  browser: +type_password_1
  selector: 'input[type=password]'
  keys: ["Enter"]
  ignoreError: true

# URLへ遷移_更新したいアプリ
+go_to_1:
  action>: GoTo
  browser: +send_keys_1
  url: 'https://サブドメイン名.cybozu.com/k/アプリID'

# ページ内でJavaScriptを実行する_レコードを新規作成・一括登録
+inject_script_1:
  action>: InjectScript
  browser: +go_to_1
  code: "(async () => {\n  const appId = kintone.app.getId();\n\n  const postReqBody = ${JSON.stringify(reqBody)}\n\n  const postResp = await kintone\n    .api(kintone.api.url(\"/k/v1/record\", true), \"POST\", postReqBody)\n    .catch(e => e.message);\n  return postResp;\n})();\n"
  waitAfter: 5000
  returnValue: true

# ページ内でJavaScriptを実行する_ページ更新
+inject_script_3:
  action>: InjectScript
  browser: +go_to_1
  code: "location.reload();\n"
  waitBefore: 2000
  waitAfter: 5000
  returnValue: false

# スクリーンショットを撮る
+take_screenshot_1:
  action>: TakeScreenshot
  browser: +inject_script_3
  full_page: false
  type: png
<kintone>テーブル サブテーブル

このページは役に立ちましたか?