テーブルレコードの更新のための配列組み込み

コーディング開発初心者です。

何度かトライアンドエラーを繰り返し、アプリを作成していますが行き詰ってしまいました。

コミュニティの近似QAやこちらのマニュアルなどを参照しているのですが、自己解決できませんでした。

<やりたいこと>

アプリA:シフト提出アプリ

アプリB:日報アプリ

 

アプリAのテーブルレコードにシフト希望を複数登録し、プロセス更新で

①Google Calendarへイベント登録

②Google CalendarのイベントIDをテーブルに登録 ←※ここで挫折

③アプリBへテーブル1行を1レコードで新規レコード作成

Google CalendarのイベントIDを配列に組み込んで、更新(PUT)しようとしてもレコードに反映されません。

イベントIDの取得、配列の行IDの取得はできており、行IDを指定して配列に組み込んでも、新しい別の行として登録されてしまいます。

こちら、解決方法をご教示お願いいたします。

よろしくお願いいたします。

 

  //ステータス更新処理//////////////////////////////////////////////////////

  kintone.events.on([
    'app.record.detail.process.proceed'
  ], function (event) {

    var record = event.record;
    var nStatus = event.nextStatus.value
    var user = kintone.getLoginUser()['code'];
    var table = record['subTable'].value;

    if (nStatus === "シフト登録済"){     

      if (!record) {return event}
      // Google認証チェック // 認証呼び出し
      if (!gapi.auth2.getAuthInstance().isSignedIn.get()) {
        gapi.auth2.getAuthInstance().signIn();
        alert('Google認証されていません。');
        return;
      }

      for (var i = 0; i < table.length; i++) {

        var sDayTime = table[i].value['Gcalendar開始'].value
        var eDayTime = table[i].value['Gcalendar終了'].value

        // APIパラメータの設定
        var params = {
          'summary': record["event_name"].value,
          'start': {'dateTime': sDayTime,'timeZone': 'Asia/Tokyo'},
          'end': {'dateTime': eDayTime,'timeZone': 'Asia/Tokyo'},
        };

        // リクエストメソッドとパラメータの設定
        var request;
        // 公開済みイベント(更新)
        if (table[i].value['event_id'].value) {
          request = gapi.client.calendar.events.update({
            'calendarId': calendar_id,
            'eventId': table[i].value['event_id'].value,
            'resource': params
          });
        // 未公開イベント(追加)
        } else {
          request = gapi.client.calendar.events.insert({
            'calendarId': calendar_id,
            'resource': params
          });
        }

        // Googleカレンダーへ登録実行
        request.execute(function(resp) {
          if (resp.error) {alert('イベントの登録に失敗しました。');
          } else {
            var tableId = record["subTable"].value[i - 1].id
            table.push({
              "id": tableId,
                "value":{
                  "event_id": {
                    'value': resp.result.id
                  }
                }
            });
          }
        },
          function(error){alert('Google イベントIDの登録に失敗しました。')}
        );

      }//forクローズ

      console.log(table)

      var body = {
        'app': kintone.app.getId(),
        'id': record.$id.value,
        'record': {
          'subTable': {
            "value": table
          }
        }
      };

      return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', body).then(function(success) {
        alert('カレンダーにイベントを登録しました。');
        //日報アプリへシフト登録
        var postApp = 89;                 
        var subTable = 'subTable';//テーブルのフィールドコード           
        kintone.api(kintone.api.url('/k/v1/records', true), 'POST', {
          app: postApp,
          records: event.record[subTable].value.map(function (row) {return row.value})
        });

        //location.reload();
      }).catch(function(error){        
        alert('Google イベントIDの登録に失敗しました。')
      })

    };//ifクローズ
  });//kintone.eventsクローズ

 

<console.log(table)>

ヤマナオさん

テーブルの更新ややこしいですよね、自分も結構ハマります。

kintone rest api で既存のテーブルの行を更新するんですよね?
でしたら、pushではなく、既存のレコードに値を設定する形で大丈夫ですよ

ヤマナオ さんの場合だと以下のような形でリクエストボディを作れば更新可能だと思います。

var body = {
    'app':アプリID,
    'id':レコードID,
    "record":{
        "subTable":{
            "value":[
                {
                    "id":"更新する行のid",
                    "value":{
                        "event_id":{
                            "value":"Google CalendarのイベントID"
                        }
                    }
                }
            ]
        }
    }
}

テーブル行更新時のリクエストボディは、レコード更新 API のドキュメントにも例があるのでご覧ください。

ヤマナオ さん

先ほどは気づかなかったのですが、プロセスの変更イベント時に Promiseで rest api 実行してることで、エラー出ませんか?

エラーが出る場合、request.execute() の else 部分で実行すればエラー出ないと思いますので、試してみてください。

※ 値を反映させるために、画面の更新が必要になります。

しぶいさん

コメントありがとうございます。

>equest.execute() の else 部分で実行

当初下記コードで実装したところ、テーブルレコード1行の場合は、テーブル内へのイベントIDの書込みも正しく反映したのですが、

複数行で実行すると、最終行のレコードに更新されてテーブルが1行になってしまいました。

(1行目~最終行の1つ前の行まで消える)

        // Googleカレンダーへ登録実行
        request.execute(function(resp) {
          if (resp.error) {
            alert('イベントの登録に失敗しました。');
          } else {
              var tableId = record["subTable"].value[i - 1].id
              var body = {
              'app': kintone.app.getId(),
              'id': record.$id.value,
              'record': {
                'subTable': {
                  "value": [
                    {
                      "id": tableId,
                      "value":{
                        "event_id":{
                          'value': resp.result.id
                        }
                      }
                    }
                  ]
                }
              }
            };
            return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', body).then(function(success) {
              alert('カレンダーにイベントを登録しました。');
              location.reload();
            }).catch(function(error){
              alert('Google イベントIDの登録に失敗しました。')
            });
          }
        },
          function(error){alert('Google イベントIDの登録に失敗しました。')}
        );

 

 

そこでこちらのコミュニティを参考に最初のコードに変更したのですがうまく動きませんでした。

私自身、Promiseの書き方も理解していないようなレベルなのですが、またお教えいただけますと幸いです。

 

 

ヤマナオ さん

テーブルを rest api で更新する場合、指定した行以外は削除されてしまいます。
事前に言うべきでしたね。失礼しました。

なるほど、push しているのは、そういう経緯があったのですね。

ヤマナオ さんの場合、イベントオブジェクトからとったテーブルの配列に追加してるため、
同じ id のテーブルが追加されている状況かなって思います。

あらかじめ、空の配列を作り、テーブルの id からのオブジェクトを空の配列に push することで、
テーブル用のオブジェクトが作成可能です。
省略していますが、↓のような形になると思います。

var table = event.record.Table.value;
var array = []
for(var i = 0; i < table.length; i++) {
array.push({
"id":table[i].id,
"value":{
"フィールドコード": {
"value": "フィールド値"
}
}
});
}
var body = {
'app': kintone.app.getId(),
'id': record.$id.value,
'record': {
'Table': {
"value": array
}
}
};

 

しぶいさん

返信遅くなり失礼しました。

ご教示いただいた方法で実装したところ、プロセス更新でテーブルレコードが全て消えてしまいました。

こちらのアプリは、重要性の観点からこれ以上開発に時間を掛けることを断念し、別の方法に切りかえました。

様々なアドバイス、誠にありがとうございました。