kintoneにスケジュール管理アプリを作成し、レコード作成/編集完了時にGaroonのスケジュールに
登録する処理を考えております。
以下のコードでスケジュールへ登録は実現できたのですが、更新が上手く行きません。
コンソールエラー無し・ステータスコード200で処理は正常に完了するのですが、
Garoon側の添付ファイルは差し替え前のまま更新されない状態です。(その他の項目は問題なく更新されます)
原因がわかる方がおりましたらご教示いただけますと幸いです。
・参考にしたドキュメント :予定を更新する
(() => {
'use strict';
// リクエストトークン取得
const getRequestToken = async () => {
const body =
'<?xml version="1.0" encoding="UTF-8"?>' +
'<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:schedule_services="http://wsdl.cybozu.co.jp/schedule/2008">' +
'<SOAP-ENV:Header>' +
'<Action SOAP-ENV:mustUnderstand="1" xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing">UtilGetRequestToken</Action>' +
'<Timestamp SOAP-ENV:mustUnderstand="1" Id="id" xmlns="http://schemas.xmlsoap.org/ws/2002/07/utility">' +
'<Created>2037-08-12T14:45:00Z</Created>' +
'<Expires>2037-08-12T14:45:00Z</Expires>' +
'</Timestamp>' +
'<Locale>jp</Locale>' +
'</SOAP-ENV:Header>' +
'<SOAP-ENV:Body>' +
'<UtilGetRequestToken>' +
'<parameters></parameters>' +
'</UtilGetRequestToken>' +
'</SOAP-ENV:Body>' +
'</SOAP-ENV:Envelope>';
const resp = await fetch('/g/util_api/util/api.csp?', {
method: 'POST',
body: body,
});
if (!resp.ok) alert(resp.statusText);
const parser = new DOMParser();
const respText = await resp.text();
const doc = parser.parseFromString(respText, 'text/xml');
const token = doc.querySelector('request_token').textContent;
return token;
};
kintone.events.on(['app.record.create.submit.success', 'app.record.edit.submit.success'], async event => {
const record = event.record;
const appId = kintone.app.getId();
const recordId = record['$id'].value;
const scheduleId = record['予定ID'].value; // 数値フィールド
const title = record['タイトル'].value; // 文字列一行フィールド
const users = record['参加者'].value; // ユーザー選択フィールド
const start = record['開始日時'].value; // 日時フィールド
const end = record['終了日時'].value; // 日時フィールド
const memo = record['メモ'].value; // 文字列複数行フィールド
const files = record['添付ファイル'].value; // 添付ファイルフィールド
// 参加者にtypeを追加
const attendees = users.map(element => {
return { ...element, type: 'USER' };
});
// 日付操作はdayjsを使用
const startDate = dayjs(start).format('YYYY-MM-DDTHH:mm:ssZ');
const endDate = dayjs(end).format('YYYY-MM-DDTHH:mm:ssZ');
const requestToken = await getRequestToken();
const fileKey = files[0].fileKey;
const fileName = files[0].name;
// 添付ファイルをダウンロード
const getFileResp = await fetch(`/k/v1/file.json?fileKey=${fileKey}`, {
method: 'GET',
headers: { 'X-Requested-With': 'XMLHttpRequest' },
});
const blob = await getFileResp.blob();
// 添付ファイルをBase64エンコード
const reader = new FileReader();
reader.readAsDataURL(blob);
await new Promise(resolve => (reader.onload = () => resolve()));
const base64Data = reader.result.split(',')[1];
const scheduleUrl = 'https://**********.cybozu.com/g/api/v1/schedule/events';
const header = {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest',
};
const body = {
__REQUEST_TOKEN__: requestToken,
eventType: 'REGULAR',
subject: title,
start: {
dateTime: startDate,
timeZone: 'Asia/Tokyo',
},
end: {
dateTime: endDate,
timeZone: 'Asia/Tokyo',
},
attendees: attendees,
attachments: [
{
name: fileName,
content: base64Data,
},
],
notes: memo,
};
const params = {
method: 'POST',
headers: header,
body: JSON.stringify(body),
};
if (!scheduleId) {
// 予定IDがkintoneのレコード内に登録されていなければPOST
const respPost = await fetch(scheduleUrl, params);
if (!respPost.ok) {
alert(respPost.statusText);
return event;
}
const result = await respPost.json();
// kintoneのレコード内に予定IDを登録
const putParams = {
app: appId,
id: recordId,
record: { 予定ID: { value: result.id } },
};
await kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', putParams).catch(error => {
alert(error.messsage);
return event;
});
} else {
// 予定IDがkintoneのレコード内に登録されていればPATCH
params.method = 'PATCH';
const respPatch = await fetch(`${scheduleUrl}/${scheduleId}`, params);
if (!respPatch.ok) {
alert(respPatch.statusText);
return event;
}
}
alert('完了しました');
return event;
});
})();