You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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);
      }
    });
  }
}

说明

  1. 先获取原文件对象,判断其MIME类型是否为image/heic;
  2. 对HEIC文件,用getAs()获取JPEG格式的Blob,在目标文件夹创建新文件,同时可选择处理原文件(移动或删除);
  3. 非HEIC文件保持原逻辑直接移动到目标文件夹。

内容的提问来源于stack exchange,提问作者ajwong4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:17:41