@osawa さん
単純なエンコードで済む話かと思いましたが、だいぶ苦戦しました。すみません。以前VBAでkintoneにファイルアップロードする際に同様の文字化けで悩んだのを思い出しました・・・
payload部分がポイントなんですがboundary生成して送るあたりについて気になればお調べいただければと思います(私自身完全に理解できてると言えず、説明不足になりますので)
下記コードでフォルダ内の1つの日本語pdfをkintoneへアップしつつ、ドライブ別フォルダ移動は確認できました。
fileKeyの精査とレコード数分回すしてkintoneRecords変数への書き込みをしていないので一度テストしていただいたあと、追加してもらえればと思います。
※追記-編集
このままkintoneに上がったPDF開いたところ、ファイルが開けないので再度確認してみますね。
const folderIdToWatch = ''; // Google Driveの監視するフォルダID
const targetFolderId = ''; // 移動先のフォルダID
const subdomain = ''; // サブドメイン名
const appToken = '';
const appID = '';
const appName = 'test'; //アプリ名
function monitorDriveFolder() {
var folder = DriveApp.getFolderById(folderIdToWatch);
var files = folder.getFiles();
while (files.hasNext()) {
var file = files.next();
if (file.getName().toLowerCase().endsWith(".pdf")) {
processPDFFile(file);
}
}
}
function processPDFFile(file) {
const apps = {
YOUR_APPLICATION1: { appid: appID, name: appName, token: appToken },
};
var fileName = file.getName();
var fileID = file.getId();
let fileKey = uploadFile(fileID);
var fileNameParts = fileName.replace(".pdf", "").split("_");
let kintoneRecords = [
{
"名刺PDF": {
"value": [
{
"fileKey": fileKey,
},
],
},
"お名前": {
"value": fileNameParts[0].replace(/[\s ]/g, '').replace(/[\s ]/g, ''),
},
"会社名": {
"value": fileNameParts[1],
},
"お電話番号": {
"value": fileNameParts[2],
},
"郵便番号": {
"value": fileNameParts[3],
},
},
];
const manager = new KintoneManager.KintoneManager(subdomain + '.cybozu.com', apps); // ライブラリの初期化
const createResponse = manager.create('YOUR_APPLICATION1', kintoneRecords);
const code = createResponse.getResponseCode();
Logger.log(createResponse)
Logger.log('Response code is "%s"', code);
if (code === 200) {
file.moveTo(DriveApp.getFolderById(targetFolderId));
}
}
function uploadFile(fileId) {
const file = DriveApp.getFileById(fileId);
const blob = file.getBlob();
const boundary = 'my_boundary'; // マルチパートデータの境界
const url = 'https://' + subdomain + '.cybozu.com/k/v1/file.json';
const bodyText =
`--${boundary}\r\n
Content-Disposition: form-data; name="file"; filename="${blob.getName()}"\r\n
Content-Type: ${blob.getContentType()}\r\n\r\n`;
const requestBody = Utilities.newBlob(bodyText).getBytes()
.concat(blob.getBytes())
.concat(Utilities.newBlob('\r\n--' + boundary + '--\r\n').getBytes());
const headers = {
'Content-Type': `multipart/form-data; boundary=${boundary}`,
'X-Requested-With': 'XMLHttpRequest',
'X-Cybozu-API-Token': appToken,
'Content-Transfer-Encoding': 'base64',
'Content-Disposition': `form-data; name="file"; filename*=${Utilities.base64EncodeWebSafe(file.getName(), Utilities.Charset.UTF_8)}`,
};
const options = {
'method': 'post',
'headers': headers,
'payload': requestBody,
};
const response = UrlFetchApp.fetch(url, options);
const responseData = response.getContentText();
const jsonResponse = JSON.parse(responseData);
Logger.log(jsonResponse);
return jsonResponse.fileKey;
}
}