APIで自動転記、更新をしたい

APIを使ってアプリ間を自動転記(追加・更新)を行いたい

〇SMabcアプリ アプリID391
SB.ルックアップフィールド
SN.文字列フィールド
SNN.計算数値フィールド
KK.文字列フィールド
SM.文字列フィールド

〇MSabcアプリ アプリID392
TMSB.文字列フィールド
TMSN.文字列フィールド
TMSNN.数値
TMKK.文字列フィールド
TMSM.文字列フィールド

と2つアプリがあり
⑴SBabcアプリに新規レコードが追加されて保存したとき
⑵SBabcアプリのSNN.計算数値フィールド値以外のフィールド値が変更されて保存したとき
MSabcアプリのそれぞれのフィールドに
1⃣レコード新規追加
2⃣レコードの変更更新をしたい
それでそのコードを作成してみました

発生した問題やエラーメッセージを具体的に書きましょう

1⃣の追加動作は正常に動く
2⃣の更新動作が動かない

実行したコードのコピー&ペースト

(function () {
‘use strict’;

// MSabcマスタアプリにレコードを追加または更新する関数
function addOrUpdateRecordToWorkScheduleApp(event) {
var record = event.record; // 社員名管理アプリのレコードデータ

// デバッグ用: フィールドの値をコンソールに表示
console.log('SNN:', record['SNN'].value);
console.log('SN:', record['SN'].value);
console.log('SM:', record['SM'].value);
console.log('SB:', record['SB'].value);
console.log('KK:', record['KK'].value);

// MSabcアプリのアプリIDとAPIトークンを設定
var MSabcAppId = '392';
var apiToken = '';

// 必要なフィールドの存在を確認してからデータを作成
var assigneeData = {
  app: MSabcAppId,
  record: {}
};

if (record['SNN']) {
  assigneeData.record['TMSNN'] = { value: record['SNN'].value };
}

if (record['SN']) {
  assigneeData.record['TMSN'] = { value: record['SN'].value };
}

if (record['SM']) {
  assigneeData.record['TMSM'] = { value: record['SM'].value };
}

if (record['SB'] && record['SB'].value) {
  assigneeData.record['TMSB'] = { value: record['SB'].value };
}

if (record['KK']) {
  assigneeData.record['TMKK'] = { value: record['KK'].value };
}

// 必要なフィールドがあれば同様に追加
// if (record['フィールドコード']) {
//   assigneeData.record['フィールドコード'] = { value: record['フィールドコード'].value };
// }

// MSabcアプリを検索するためのクエリを作成
var query = 'TMSNN = "' + record['SNN'].value + '"';

// MSabcマスタアプリを検索して対応するレコードを取得
kintone.api(
  kintone.api.url('/k/v1/records', true) + '?app=' + MSabcAppId + '&query=' + encodeURIComponent(query),
  'GET',
  {},
  function(response) {
    var assigneeRecords = response.records;

    if (assigneeRecords.length === 1) {
      // 該当するレコードが見つかった場合は、MSabcマスタアプリのレコードを更新
      kintone.api(
        kintone.api.url('/k/v1/record', true) + '?app=' + MSabcAppId + '&id=' + assigneeRecords[0]['$id'].value,
        'PUT',
        assigneeData,
        function(response) {
          console.log('MSabcマスタアプリのレコードを更新しました。');
          console.log(response);
        },
        function(error) {
          console.error('MSabcアプリのレコードの更新に失敗しました。');
          console.error(error);
        }
      );
    } else {
      // 該当するレコードが見つからない場合は、新しいレコードとして追加
      kintone.api(
        kintone.api.url('/k/v1/record', true),
        'POST',
        assigneeData,
        function(response) {
          console.log('MSabcマスタアプリに新しいレコードを追加しました。');
          console.log(response);
        },
        function(error) {
          console.error('MSabcマスタアプリに新しいレコードの追加に失敗しました。');
          console.error(error);
        }
      );
    }
  },
  function(error) {
    console.error('Msabcマスタアプリの検索に失敗しました。');
    console.error(error);
  }
);

}

// SMabcアプリの保存イベント(新規作成と更新時の両方)
kintone.events.on([‘app.record.create.submit’, ‘app.record.edit.submit’], function(event) {
// 関数を呼び出す
addOrUpdateRecordToWorkScheduleApp(event);
return event;
});
})();

エラー内容
/k/v1/record.json?app=392&id=1:1
Failed to load resource: the server responded with a status of 400 (Bad Request)
download.do?app=391&…f5eb48d0598051d7:72
MSabcアプリのレコードの更新に失敗しました。
download.do?app=391&…f5eb48d0598051d7:73

新規追加はできるが更新ができなくて困っています
まだ初心者なためこれ以上詳しいことがわからないのですが、どなたか更新されない理由や対策をご教示願いたいです

APIトークンは適当にマスクしてください。

aa

15 分

[quote=“miyawaki, post:1, topic:7885”]
APIを使ってアプリ間を自動転記(追加・更新)を行いたい

〇SMabcアプリ アプリID391
SB.ルックアップフィールド
SN.文字列フィールド
SNN.計算数値フィールド
KK.文字列フィールド
SM.文字列フィールド

〇MSabcアプリ アプリID392
TMSB.文字列フィールド
TMSN.文字列フィールド
TMSNN.数値
TMKK.文字列フィールド
TMSM.文字列フィールド

と2つアプリがあり
⑴SBabcアプリに新規レコードが追加されて保存したとき
⑵SBabcアプリのSNN.計算数値フィールド値以外のフィールド値が変更されて保存したとき
MSabcアプリのそれぞれのフィールドに
1⃣レコード新規追加
2⃣レコードの変更更新をしたい
それでそのコードを作成してみました

発生した問題やエラーメッセージを具体的に書きましょう

1⃣の追加動作は正常に動く
2⃣の更新動作が動かない

実行したコードのコピー&ペースト

(function () {
‘use strict’;

// MSabcマスタアプリにレコードを追加または更新する関数
function addOrUpdateRecordToWorkScheduleApp(event) {
var record = event.record; // 社員名管理アプリのレコードデータ

// デバッグ用: フィールドの値をコンソールに表示
console.log('SNN:', record['SNN'].value);
console.log('SN:', record['SN'].value);
console.log('SM:', record['SM'].value);
console.log('SB:', record['SB'].value);
console.log('KK:', record['KK'].value);

// MSabcアプリのアプリIDとAPIトークンを設定
var MSabcAppId = '392';
var apiToken = '';

// 必要なフィールドの存在を確認してからデータを作成
var assigneeData = {
  app: MSabcAppId,
  record: {}
};

if (record['SNN']) {
  assigneeData.record['TMSNN'] = { value: record['SNN'].value };
}

if (record['SN']) {
  assigneeData.record['TMSN'] = { value: record['SN'].value };
}

if (record['SM']) {
  assigneeData.record['TMSM'] = { value: record['SM'].value };
}

if (record['SB'] && record['SB'].value) {
  assigneeData.record['TMSB'] = { value: record['SB'].value };
}

if (record['KK']) {
  assigneeData.record['TMKK'] = { value: record['KK'].value };
}

// 必要なフィールドがあれば同様に追加
// if (record['フィールドコード']) {
//   assigneeData.record['フィールドコード'] = { value: record['フィールドコード'].value };
// }

// MSabcアプリを検索するためのクエリを作成
var query = 'TMSNN = "' + record['SNN'].value + '"';

// MSabcマスタアプリを検索して対応するレコードを取得
kintone.api(
  kintone.api.url('/k/v1/records', true) + '?app=' + MSabcAppId + '&query=' + encodeURIComponent(query),
  'GET',
  {},
  function(response) {
    var assigneeRecords = response.records;

    if (assigneeRecords.length === 1) {
      // 該当するレコードが見つかった場合は、MSabcマスタアプリのレコードを更新
      kintone.api(
        kintone.api.url('/k/v1/record', true) + '?app=' + MSabcAppId + '&id=' + assigneeRecords[0]['$id'].value,
        'PUT',
        assigneeData,
        function(response) {
          console.log('MSabcマスタアプリのレコードを更新しました。');
          console.log(response);
        },
        function(error) {
          console.error('MSabcアプリのレコードの更新に失敗しました。');
          console.error(error);
        }
      );
    } else {
      // 該当するレコードが見つからない場合は、新しいレコードとして追加
      kintone.api(
        kintone.api.url('/k/v1/record', true),
        'POST',
        assigneeData,
        function(response) {
          console.log('MSabcマスタアプリに新しいレコードを追加しました。');
          console.log(response);
        },
        function(error) {
          console.error('MSabcマスタアプリに新しいレコードの追加に失敗しました。');
          console.error(error);
        }
      );
    }
  },
  function(error) {
    console.error('Msabcマスタアプリの検索に失敗しました。');
    console.error(error);
  }
);

}

// SMabcアプリの保存イベント(新規作成と更新時の両方)
kintone.events.on([‘app.record.create.submit’, ‘app.record.edit.submit’], function(event) {
// 関数を呼び出す
addOrUpdateRecordToWorkScheduleApp(event);
return event;
});
})();

エラー内容
/k/v1/record.json?app=392&id=1:1
Failed to load resource: the server responded with a status of 400 (Bad Request)
download.do?app=391&…f5eb48d0598051d7:72
MSabcアプリのレコードの更新に失敗しました。
download.do?app=391&…f5eb48d0598051d7:73

新規追加はできるが更新ができなくて困っています
まだ初心者なためこれ以上詳しいことがわからないのですが、どなたか更新されない理由や対策をご教示願いたいです

ぱっと見PUT時のパラメータの指定などが違うようにみえます。
リファレンスの「kintone REST API リクエストを送信する API を使ったリクエスト」やパラメーターなどを一度確認ください。
kintone.api()の第三引数に、アプリID、レコードID、レコードオブジェクトを指定する必要がありますが、提示されているコードはGETのときと似たような指定になってしまっています。

APIからレスポンスはかえってきてる状態なので通信内容もぜひ見てみてください。

muraさま
アドバイスいただきありがとうございます

下記のように修正してみましたが、どうにもこうにも更新がされないでいます
PUTのところをよろしければ具体的に教えてもらってもよろしいでしょうか?

現在のコード↓
(function () {
‘use strict’;

// MSabcマスタアプリにレコードを追加または更新する関数
function addOrUpdateRecordToWorkScheduleApp(event) {
var record = event.record; // 社員名管理アプリのレコードデータ

// デバッグ用: フィールドの値をコンソールに表示
console.log('SNN:', record['SNN'].value);
console.log('SN:', record['SN'].value);
console.log('SM:', record['SM'].value);
console.log('SB:', record['SB'].value);
console.log('KK:', record['KK'].value);

// MSabcアプリのアプリIDとAPIトークンを設定
var MSabcAppId = '392';
var apiToken = '';

// 必要なフィールドの存在を確認してからデータを作成
var assigneeData = {
  app: MSabcAppId,
  record: {}
};

if (record['SNN']) {
  assigneeData.record['TMSNN'] = { value: record['SNN'].value };
}

if (record['SN']) {
  assigneeData.record['TMSN'] = { value: record['SN'].value };
}

if (record['SM']) {
  assigneeData.record['TMSM'] = { value: record['SM'].value };
}

if (record['SB'] && record['SB'].value) {
  assigneeData.record['TMSB'] = { value: record['SB'].value };
}

if (record['KK']) {
  assigneeData.record['TMKK'] = { value: record['KK'].value };
}

// 必要なフィールドがあれば同様に追加
// if (record['フィールドコード']) {
//   assigneeData.record['フィールドコード'] = { value: record['フィールドコード'].value };
// }

// MSabcアプリを検索するためのクエリを作成
var query = 'TMSM = "' + record['SM'].value + '"';

// MSabcマスタアプリを検索して対応するレコードを取得
kintone.api(
  kintone.api.url('/k/v1/records', true) + '?app=' + MSabcAppId + '&query=' + encodeURIComponent(query),
  'GET',
  {},
  function(response) {
    var assigneeRecords = response.records;

    if (assigneeRecords.length === 1) {
      // 該当するレコードが見つかった場合は、MSabcマスタアプリのレコードを更新
     kintone.api(
      kintone.api.url('/k/v1/record', true) + '?app=' + MSabcAppId + '&id=' + assigneeRecords[0]['$id'].value,
      'PUT',
      assigneeData, // レコードオブジェクトを第三引数に指定
      function(response) {
        console.log('MSabcマスタアプリのレコードを更新しました。');
        console.log(response);
      },
      function(error) {
        console.error('MSabcアプリのレコードの更新に失敗しました。');
        console.error(error);
      }
    );


    } else {
      // 該当するレコードが見つからない場合は、新しいレコードとして追加
      kintone.api(
        kintone.api.url('/k/v1/record', true),
        'POST',
        assigneeData,
        function(response) {
          console.log('MSabcマスタアプリに新しいレコードを追加しました。');
          console.log(response);
        },
        function(error) {
          console.error('MSabcマスタアプリに新しいレコードの追加に失敗しました。');
          console.error(error);
        }
      );
    }
  },
  function(error) {
    console.error('Msabcマスタアプリの検索に失敗しました。');
    console.error(error);
  }
);

}

// SMabcアプリの保存イベント(新規作成と更新時の両方)
kintone.events.on([‘app.record.create.submit’, ‘app.record.edit.submit’], function(event) {
// 関数を呼び出す
addOrUpdateRecordToWorkScheduleApp(event);
return event;
});
})();

何卒よろしくお願いいたします

レコード取得(GET)の方法と混同しているように見受けられます

下記のような指定が必要です。レコード作成(POST)も同様な誤解をされているように見受けられますので、リファレンスを今一度確認ください!

mura様
アドバイスありがとうございます!!
無事に動作させることができました!!
私のほうでGETの方法と同様だと誤解していたようです
助かりました
また機会がありましたらよろしくお願いいたします!!

「いいね!」 1

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