如何用Google Apps Script将Google表单的.heic转JPEG后存Google Drive
Google Apps Script转换HEIC为JPEG时文件存储异常问题
我做了一个接收照片的Google表单,原本能根据表单响应把上传的照片存到Google Drive的指定目标文件夹。现在想把HEIC格式的文件转换成JPEG,用了getAs("image/jpeg")函数后出问题了:
- 不用
getAs()时,HEIC文件能正常存入目标文件夹; - 用了之后,HEIC文件跑到了默认的「Files (File response)」文件夹,而且目标文件夹里根本没生成对应的JPEG文件。
后续打算用if/else只对HEIC文件做转换,现在附上出问题的代码:
function onFormSubmit(e) { // Get the destination folder var destFolder = folder_based_on_form_response; // this part works // Get all form responses let itemResponses = e.response.getItemResponses(); // Get the file upload response as an array to allow for multiple files let fileUploads = itemResponses.filter((itemResponse) => itemResponse .getItem().getType().toString() === "FILE_UPLOAD") .map((itemResponse) => itemResponse.getResponse()) .reduce((a, b) => [...a, ...b], []); // Move the files to the destination folder if (fileUploads.length > 0) { fileUploads.forEach((fileId) => { DriveApp.getFileById(fileId).getAs("image/jpeg").moveTo(destFolder); }); } }
问题原因
getAs("image/jpeg")返回的是Blob对象,而非File对象,Blob没有moveTo()方法,你的代码逻辑错误,既没生成JPEG文件,还导致原HEIC文件的处理异常。
修正后的代码
function onFormSubmit(e) { // 获取目标文件夹(原逻辑保留) var destFolder = folder_based_on_form_response; // 获取所有表单响应 let itemResponses = e.response.getItemResponses(); // 提取所有上传文件的ID let fileUploads = itemResponses.filter((itemResponse) => itemResponse.getItem().getType().toString() === "FILE_UPLOAD" ) .map((itemResponse) => itemResponse.getResponse()) .reduce((a, b) => [...a, ...b], []); if (fileUploads.length > 0) { fileUploads.forEach((fileId) => { const originalFile = DriveApp.getFileById(fileId); const fileName = originalFile.getName(); const mimeType = originalFile.getMimeType(); // 仅处理HEIC文件 if (mimeType === "image/heic") { // 转换为JPEG Blob,替换文件后缀 const jpegBlob = originalFile.getAs("image/jpeg"); const jpegFileName = fileName.replace(/\.heic$/i, ".jpeg"); // 在目标文件夹创建新的JPEG文件 destFolder.createFile(jpegBlob).setName(jpegFileName); // 可选:将原HEIC文件移动到目标文件夹,不需要的话可改为originalFile.setTrashed(true)删除 originalFile.moveTo(destFolder); } else { // 非HEIC文件直接移动到目标文件夹 originalFile.moveTo(destFolder); } }); } }
说明
- 先获取原文件对象,判断其MIME类型是否为
image/heic; - 对HEIC文件,用
getAs()获取JPEG格式的Blob,在目标文件夹创建新文件,同时可选择处理原文件(移动或删除); - 非HEIC文件保持原逻辑直接移动到目标文件夹。
内容的提问来源于stack exchange,提问作者ajwong4
相关产品推荐
相关产品推荐

