チェックボックスの連動について(別アプリ同士)

下図のように、Aアプリの『発送』のチェックが付いた時に、Bアプリの『発送』もチェックを
付けたいと考えております。
見つけた、プラグイン等で試したのですが、上手くいきません。
解決方法をご教示頂ければ幸いです。

アプリアクションを利用し

Aアプリ保存後、Bアプリに『発送』のチェック有無を連動させる方法はいかがでしょうか。

Aアプリ、Bアプリともにレコードを保存する手間はかかってしまいますが…

 

『アプリアクションを設定する』

https://jp.cybozu.help/k/ja/user/app_settings/appaction/set_appaction.html

PUTで更新できます。

https://developer.cybozu.io/hc/ja/articles/201941784-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B4%E6%96%B0-PUT- 

AアプリとBアプリで紐づくIDを用意し、一致するレコードを更新します。

チェックボックスにデータが入っていればBアプリに’発送’を渡し、NULLであればNULLを渡します。

以下、殴り書きですがコードを置いておきます。

(function () {
  'use strict';
  var putRecord = function (recordId, dm) {
    var params = {
      app: 1, // BアプリのID
      updateKey: {
        field: 'ID',
        value: recordId // Bアプリと紐づくKey
      },
      record: {
        'DM': {
          value: dm
        }
      }
    };
    return kintone.api(kintone.api.url('/k/v1/record'), 'PUT', params).then(function (resp) {
      alert('Bアプリ更新');
    });
  };
  kintone.events.on('app.record.create.submit.success', function (event) {
    var record = event.record;
    // BアプリのKeyを取得
    var Key = record['ID']['value'];
    var dm = [];
    // チェックボックス
    if (record['DM']['value'][0]) {
      dm = ['発送'];
    } else {
      dm = [];
    }
    return putRecord(Key, dm);
  });
})();

下記のコードがある場合、どの様にコードを書けばよいのでしょうか?
ご教示頂ければ、幸いです。

(function () {
"use strict";
const events = ['app.record.create.change.DM', 'app.record.edit.change.DM'];
kintone.events.on(events, function (event) {
var table = event.record.発送リスト.value;
var id = event.changes.row.value.ID.value;
var office = event.changes.row.value.会社名.value;
var office2 = event.changes.row.value.支店支社.value;
var post = event.changes.row.value.郵便番号.value;
var address = event.changes.row.value.都道府県.value;
var address2 = event.changes.row.value.住所1.value;
var address3 = event.changes.row.value.住所2.value;

if (event.changes.field.value.length !== 0) {
var newRow = {
"value": {
"発送ID": { "type": "NUMBER", "value": id },
"発送会社名": { "type": "SINGLE_LINE_TEXT", "value": office },
"発送支店支社": { "type": "SINGLE_LINE_TEXT", "value": office2 },
"発送郵便番号": { "type": "SINGLE_LINE_TEXT", "value": post },
"発送都道府県": { "type": "SINGLE_LINE_TEXT", "value": address },
"発送住所1": { "type": "SINGLE_LINE_TEXT", "value": address2 },
"発送住所2": { "type": "SINGLE_LINE_TEXT", "value": address3 },
}
};
table.push(newRow);
} else {
event.record.発送リスト.value = table.filter(function(row){
return row.value.発送ID.value !== id;
});
}
return event;
});
})();

チェックボックス「DM」にチェックが入ると同じ内容の行が増え、

さらにIDと紐づくBアプリのレコードのチェックボックスにチェックを入れる

という認識で合っていますか?

サンプルコードは保存時イベントなので、瞬時に更新したいのであればチェンジイベントに変更すればよいかと思います。

少し処理が重たいのでまずは確認まで。

上記の通りです。
複雑なコードを組んだことが無い為…

 

簡単に書いてみたのですが、いかがでしょうか。

フィールド名やフィールド数が不完全なので環境に合わせてください。

チェックを入れた瞬間に更新がかかるのでレコードを保存しなかった場合、Bアプリのデータが発送のままになってしまいます。

他にわからないことなどあればお答えできます。

(function () {
  'use strict';
  var putRecord = function (recordId, dm) {
    var params = {
      app: 0, // BアプリのappId
      updateKey: {
        field: 'id',
        value: recordId
      },
      record: {
        'DM': {
          value: dm
        }
      }
    };
    return kintone.api(kintone.api.url('/k/v1/record'), 'PUT', params).then(function (resp) {
      alert('Bアプリ更新');
    });
  };
  var events = ['app.record.create.change.DM', 'app.record.edit.change.DM'];
  kintone.events.on(events, function (event) {
    var record = event.record;
    var table = record['発送リスト']['value'];
    var id = event.changes.row.value.id.value;
    var office = event.changes.row.value.会社名.value;
    var dm = [];
    if (event.changes.field.value.length !== 0) {
      dm = ['発送'];
      var newRow = {
        value: {
          DM: {
            type: 'CHECK_BOX',
            value: []
          },
          id: {
            type: "NUMBER",
            value: id
          },
          会社名: {
            type: "SINGLE_LINE_TEXT",
            value: office
          }
        }
      };
      table.push(newRow);
    } else {
      record['発送リスト']['value'] = table.filter(function (row) {
        return row.value.id.value !== id;
      });
    }
    putRecord(id, dm);
    return event;
  });
})();

mionix様、ご回答誠にありがとうございます。

field: ‘id’,をレコード番号にしたいのですが、上手くいきません。
updateKeyに指定するフィールドは、決まっているのでしょうか。

var params = {
 app: 127, // BアプリのappId
 updateKey: {
  field: 'id',
  value: recordId
 },
 record: {
  'DM': { value: dm },
 }
};

field: 'id’をレコード番号のフィールドコードに変更して動作しませんか?

value: recordIdはAアプリ内のIDを取得した値です。

varparams= {
 app:127,// BアプリのappId
 updateKey: {
  field:'レコード番号', ←Bアプリのレコード番号のフィールドコード
  value: recordId
 },
 record: {
  'DM': {value: dm },
 }
};

mionix様、ご回答誠にありがとうございます。

レコード番号に変更すると、

*******************************************************************
“レコードの更新に失敗しました。
「updateKey」に指定したフィールド(code: レコード番号)が不正です。
「updateKey」には、文字列(1行)フィールドか数値フィールドのみ指定できます。
また、フィールドの設定で、値の重複を禁止する必要があります。”
*******************************************************************

とエラーが表示されてしまいます。

すみません、忘れてました。

updateKeyではなく、idで指定して下さい。

いかがでしょうか・・・

var params = {
        app: 127, // BアプリのappId
        id: recordId,
        record: {
          'DM': {
            value: dm
          }
        }

mionix様、ご回答誠にありがとうございます。

無事解決しました。
ありがとうございました。