新規投稿
フォローする

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

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

0

11件のコメント

Avatar
本田愛香

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

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

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

 

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

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

0
Avatar
mionix

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);
  });
})();
0
Avatar
kintone_TS44

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

(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;
});
})();
0
Avatar
mionix

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

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

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

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

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

0
Avatar
kintone_TS44

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

 

0
Avatar
mionix

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

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

チェックを入れた瞬間に更新がかかるのでレコードを保存しなかった場合、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;
  });
})();
0
Avatar
kintone_TS44

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

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

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

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

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

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

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

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

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

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

0
Avatar
mionix

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

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

いかがでしょうか・・・

    var params = {
        app: 127, // BアプリのappId
        id: recordId,
        record: {
          'DM': {
            value: dm
          }
        }
mionixにより編集されました
0
Avatar
kintone_TS44

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

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

0
サインインしてコメントを残してください。