連動動作のエラー

日報アプリを作成しています。日報アプリで直接入力とスケジュールアプリからその日のスケジュールを連動させたい。

JavaScriptを書いて修正を重ねていますが、エラーが解消されません。

直接入力をした後追加ボタンを押すと、日報のテーブルに必要項目が入るようにしているのに、開始日時と終了日時を入れていても”「開始時間」「終了時間」が入っていない”とか、追加したとメッセージが出てもそのメッセージを閉じるとエラーが出ます。また、日報連動を行うと連動したとメッセージが出ますが閉じると同じエラーが表示されます。

(エラー)
カスタマイズ用のJavaScriptの実行時にエラーが発生しました。アプリの管理者にお問い合わせください。

  • - event.record[‘日報’].value[1][‘開始’].type が不正です。

  • - event.record[‘日報’].value[1][‘終了’].type が不正です。

  • - event.record[‘日報’].value[1][‘内容’].type が不正です。

  • - event.record[‘日報’].value[1][‘備考’].type が不正です。

  • - event.record[‘日報’].value[1][‘所要時間’].type が不正です。

  • - event.record[‘日報’].value[1][‘計算’].type が不正です。

どなたかご教授お願い致します。

実行したコードをコピー&ペーストしましょう

(function () {
  "use strict";

  const tableFieldCode = "日報";
  const inputFields = {
    date: "日付",
    start: "開始時間",
    end: "終了時間",
    content: "内容テーブル転記用",
    customer: "顧客名",
    partner: "面談者名",
    training: "研修名"
  };

  function getFieldValue(record, code) {
    if (!record[code] || record[code].value === null || record[code].value === undefined) {
      return "";
    }
    return String(record[code].value);
  }

  function addRowToTable() {
    const record = kintone.app.record.get().record;
    const startVal = getFieldValue(record, inputFields.start);
    const endVal = getFieldValue(record, inputFields.end);
    const contentVal = getFieldValue(record, inputFields.content);

    if (!startVal || !endVal) {
      alert("開始時間・終了時間を入力してください。");
      return;
    }
    if (!contentVal) {
      alert("内容を入力してください。");
      return;
    }

    const newRow = {
      value: {
        開始: { value: startVal },
        終了: { value: endVal },
        内容: { value: contentVal },
        備考: { value: "" },
        所要時間: { value: null },
        計算: { value: null }
      }
    };

    record[tableFieldCode].value = record[tableFieldCode].value || [];
    record[tableFieldCode].value.push(newRow);

    kintone.app.record.set({ record });
    alert("日報テーブルに追加しました。");
  }

  async function linkSchedule() {
    const record = kintone.app.record.get().record;
    const dateVal = getFieldValue(record, inputFields.date);
    if (!dateVal) {
      alert("日付が未入力です");
      return;
    }

    const appId = 126;
    const startDateTime = `${dateVal}T00:00`;
    const endDateTime = `${dateVal}T23:59`;
    const query = `開始日時 >= "${startDateTime}" and 開始日時 <= "${endDateTime}" order by 開始日時 asc`;

    try {
      const resp = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
        app: appId,
        query: query,
        fields: ["開始日時", "終了日時", "日報表示"]
      });

      if (!resp.records || resp.records.length === 0) {
        alert("当日のスケジュールが見つかりませんでした。");
        return;
      }

      const newRows = resp.records.map(sch => {
        const startTime = sch["開始日時"].value.split("T")[1]?.slice(0, 5) || "";
        const endTime = sch["終了日時"].value.split("T")[1]?.slice(0, 5) || "";
        const contentVal = getFieldValue(sch, "日報表示");

        return {
          value: {
            開始: { value: startTime },
            終了: { value: endTime },
            内容: { value: contentVal },
            備考: { value: "" },
            所要時間: { value: null },
            計算: { value: null }
          }
        };
      });

      record[tableFieldCode].value = (record[tableFieldCode].value || []).concat(newRows);
      kintone.app.record.set({ record });
      alert("スケジュール連動が完了しました。");

    } catch (err) {
      console.error(err);
      alert("スケジュール取得エラー: 入力内容が正しくありません。");
    }
  }

  kintone.events.on('app.record.create.submit', function (event) {
    const record = event.record;
    let totalMinutes = 0;

    record[tableFieldCode].value.forEach(row => {
      const start = row.value.開始.value;
      const end = row.value.終了.value;
      if (start && end) {
        const [sH, sM] = start.split(":").map(Number);
        const [eH, eM] = end.split(":").map(Number);
        totalMinutes += (eH * 60 + eM) - (sH * 60 + sM);
      }
    });

    if (totalMinutes < 450) {
      alert("合計時間が就業時間の7時間30分に満たないため確認してください。\n問題なければそのまま申請にすすんで下さい。");
    }

    return event;
  });

  kintone.events.on(['app.record.create.show', 'app.record.edit.show'], function () {
    const spaceElem = kintone.app.record.getSpaceElement('addScheduleSpace');
    if (!spaceElem) return;

    const addBtn = document.createElement('button');
    addBtn.textContent = "追加";
    addBtn.style.backgroundColor = "#4CAF50";
    addBtn.style.color = "#fff";
    addBtn.style.borderRadius = "8px";
    addBtn.style.padding = "6px 12px";
    addBtn.style.marginRight = "10px";
    addBtn.onclick = addRowToTable;

    const linkBtn = document.createElement('button');
    linkBtn.textContent = "スケジュール連動";
    linkBtn.style.backgroundColor = "#2196F3";
    linkBtn.style.color = "#fff";
    linkBtn.style.borderRadius = "8px";
    linkBtn.style.padding = "6px 12px";
    linkBtn.onclick = linkSchedule;

    spaceElem.appendChild(addBtn);
    spaceElem.appendChild(linkBtn);
  });

})();

起こっている問題としては、

  • 日報アプリ上の「追加」ボタンをクリックしたときに、テーブルに行を追加しようとするとエラーが発生する
  • 日報アプリ上の「スケジュール連動」ボタンをクリックしたときに、スケジュールアプリからデータは取得できているのに、テーブルに行を追加しようとするとエラーが発生する

ということでしょうかね?

JavaScript API からテーブルの値を操作するときは、フィールドタイプも指定する必要があるので、それでエラーが出ているのかなと思います。

「いいね!」 2

上記言及されている通り、このパターンはフィールドタイプ指定もれの可能性がたかいですね!(テーブルに行を挿入するときにTYPEの指定は必須

「いいね!」 3

フィールドタイブを指定したらテーブルに入れることができました。
まだ少しエラーがありますが、レコードが入らないところで何度も引っかかっていたので、スッキリしました。まだまだ初心者で躓いてばかりですが、今回解消できて、前向きに学べそうな気持ちにもなり感謝しております。
ありがとうございました :head_shaking_vertically:

「いいね!」 2

おっしゃる通りでした。
ありがとうございました :head_shaking_vertically:

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