お世話になっております。
以下のGASをwebhookで起動させ、以下の処理を実装したいと考えております。
1.kintoneの添付ファイルを、GoogleDriveの指定のフォルダに保存
2.保存したファイルのURLを、トリガーとなったレコードの文字列フィールド「Driveリンク」にセットしたい(上書き更新)
コードは以下を参考にしております。
現在、Driveに保存して、そのURLを取得するところまではうまくいっています。しかし、レコードが更新されず、新規作成されてしまいます。
エラーを確認すると、302のエラーコードで、リダイレクトが生じているようです。
どこをどう修正してよいかわからず、行き詰っています。
ご教示いただけますと幸いです。
// 定数の定義
const KINTONE_API_TOKEN = 'APITOKEN'; // kintoneのAPIトークン
const KINTONE_APP_ID = 2167; // kintoneアプリID
const GOOGLE_DRIVE_FOLDER_ID = 'xxxxx'; // Google DriveフォルダID
const KINTONE_API_URL_FILE = 'https://subdomein.cybozu.com/k/v1/file.json'; // kintoneファイルAPIのURL
const KINTONE_API_URL_RECORD = 'https://subdomein.cybozu.com/k/v1/record.json'; // kintoneレコードAPIのURL
function doPost(e) {
try {
// Webhookから送られてきたデータを解析
const data = JSON.parse(e.postData.contents);
// 必要な情報の検証
if (!data.record || !data.record['出力pdf'] || !data.record['出力pdf'].value[0]) {
throw new Error('Invalid data received from webhook');
}
const fileKey = data.record['出力pdf'].value[0].fileKey; // kintoneのファイルキー
const recordId = data.record.$id.value; // kintoneのレコードID
Logger.log(`App ID: ${KINTONE_APP_ID}`);
Logger.log(`Record ID: ${recordId}`);
Logger.log(`File Key: ${fileKey}`);
// kintoneからファイルを取得
const fileBlob = getKintoneFile(fileKey);
if (fileBlob) {
// Google Driveにアップロード
const fileName = data.record['出力pdf'].value[0].name;
const file = DriveApp.getFolderById(GOOGLE_DRIVE_FOLDER_ID).createFile(fileBlob).setName(fileName);
// アップロードされたファイルのURLを取得
const fileUrl = file.getUrl();
// kintoneにDriveリンクを更新
const updateSuccess = updateKintoneRecord(recordId, fileUrl);
if (updateSuccess) {
return ContentService.createTextOutput(JSON.stringify({ status: 'success', fileUrl: fileUrl }))
.setMimeType(ContentService.MimeType.JSON);
} else {
return ContentService.createTextOutput(JSON.stringify({ status: 'error', message: 'Failed to update kintone record' }))
.setMimeType(ContentService.MimeType.JSON);
}
} else {
return ContentService.createTextOutput(JSON.stringify({ status: 'error', message: 'File not found' }))
.setMimeType(ContentService.MimeType.JSON);
}
} catch (error) {
Logger.log(`Exception: ${error.toString()}`);
return ContentService.createTextOutput(JSON.stringify({ status: 'error', message: error.toString() }))
.setMimeType(ContentService.MimeType.JSON);
}
}
// kintoneからファイルを取得する関数
function getKintoneFile(fileKey) {
const kintoneApiUrl = `${KINTONE_API_URL_FILE}?fileKey=${fileKey}`;
const headers = {
'X-Cybozu-API-Token': KINTONE_API_TOKEN,
};
const options = {
method: 'get',
headers: headers,
muteHttpExceptions: true
};
try {
const response = UrlFetchApp.fetch(kintoneApiUrl, options);
Logger.log(`File fetch response code: ${response.getResponseCode()}`);
Logger.log(`File fetch response: ${response.getContentText()}`);
if (response.getResponseCode() === 200) {
return response.getBlob();
} else {
Logger.log(`Error fetching file: ${response.getContentText()}`);
return null;
}
} catch (error) {
Logger.log(`Exception fetching file: ${error.toString()}`);
return null;
}
}
// kintoneのレコードを更新する関数
function updateKintoneRecord(recordId, fileUrl) {
const postData = {
app: KINTONE_APP_ID,
id: recordId,
record: {
'Driveリンク': {
value: fileUrl
}
}
};
const headers = {
'X-Cybozu-API-Token': KINTONE_API_TOKEN,
'Content-Type': 'application/json'
};
const options = {
method: 'post', // POSTメソッドを使用
headers: headers,
muteHttpExceptions: true,
payload: JSON.stringify(postData)
};
try {
const response = UrlFetchApp.fetch(KINTONE_API_URL_RECORD, options);
Logger.log(`Record update response code: ${response.getResponseCode()}`);
Logger.log(`Record update response: ${response.getContentText()}`);
if (response.getResponseCode() === 200) {
Logger.log(`Successfully updated kintone record with Drive link: ${fileUrl}`);
return true;
} else {
Logger.log(`Error updating kintone record: ${response.getContentText()}`);
return false;
}
} catch (error) {
Logger.log(`Exception updating kintone record: ${error.toString()}`);
return false;
}
}