google-apps-script - 如何使用 Google Apps 脚本将 .heic 从 Google 表单转换为 .jpeg,然后上传到 Google 云端硬盘

标签 google-apps-script google-drive-api jpeg google-forms heic

这是我第一次使用 Google 产品进行编程,所以请多多支持。

我创建了一个 Google 表单,它接受照片作为文件输入,并将它们放入 Google 云端硬盘中由表单响应确定的目标文件夹中。

我从这个资源开始:https://developers.google.com/apps-script/samples/automations/upload-files#code.gs

我当前的代码工作正常,将图像放置在正确的目标文件夹中。

我想将 .heic 文件转换为 .jpeg,以便所有设备都可以打开这些文件。我正在尝试使用函数 getAs("image/jpeg") 进行转换。

如果我省略 getAs() 函数,.heic 文件将被放置在正确的目标文件夹中。

当我使用 getAs() 函数时,.heic 文件被放置在默认的 Files(文件响应) 文件夹中,但不会创建 .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);
    });
  }
}

...

最佳答案

我相信您的目标如下。

  • 您想要通过修改脚本将 .heic 格式转换为 Jpeg 格式。

既然如此,下面的修改如何?在本次修改中,使用以下流程。

  1. 检测 .heic 文件。
  2. .heic 格式转换为 PNG 格式。
  3. 将 PNG 格式转换为 JPEG 格式。
  4. 在目标文件夹中以 JPEG 格式创建图像数据作为文件。

修改后的脚本:

来自:

if (fileUploads.length > 0) {
  fileUploads.forEach((fileId) => {
  DriveApp.getFileById(fileId).getAs("image/jpeg").moveTo(destFolder);
  });
}

致:

if (fileUploads.length > 0) {
  fileUploads.forEach((fileId) => {
    const file = DriveApp.getFileById(fileId);
    const name = file.getName();
    const mimeType = file.getMimeType();
    if (name.includes("heic") || name.includes("heif") || mimeType == "image/heic") {
      try {
        const url = `https://drive.google.com/thumbnail?id=${fileId}&sz=w1000`;
        const blob = UrlFetchApp.fetch(url, { headers: { authorization: "Bearer " + ScriptApp.getOAuthToken() } }).getBlob().getAs("image/jpeg");
        destFolder.createFile(blob.setName(name.split(".")[0] + ".jpg"));

        // file.setTrashed(true); // If you want to remove the original file, please use this.
      } catch (e) {
        console.log(e); // If an error occurs, you can see it in the log.
      }
    } else {
      file.moveTo(destFolder); // or file.getAs("image/jpeg").moveTo(destFolder);
    }
  });
}
  • 当文件为 .heic 文件时运行此脚本,.heic 文件将转换为 Jpeg 格式并移至目标文件夹。

注意:

  • 当我使用示例 .heic 文件测试此脚本时,没有发生错误。 .heic 文件可以转换为 Jpeg 格式并移动到目标文件夹。但是,如果您的 .heic 文件是无法转换的文件,则会发生错误。请小心这一点。
  • 此脚本需要一个“On Form Submit”可安装触发器。

关于google-apps-script - 如何使用 Google Apps 脚本将 .heic 从 Google 表单转换为 .jpeg,然后上传到 Google 云端硬盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76623974/

相关文章:

google-apps-script - 用于在下一个空白行中设置值的 Google Apps 脚本代码

android - 将 sdcard 文档上传到 android 中的 Google Drive

machine-learning - jpg 文件解析以提取信息/文本

java - batik 将 SVG 转换为 JPEG

javascript - 如何获取一行并将该行和文本字符串合并为一个新行

c - 如何在 C 中将 jpg 转换为 yuv?

javascript - 通过侧边栏中显示的按钮向 Google 表格中的单元格添加值

parameters - doPost(e) 不返回参数,但 doGet(e) 呢?

javascript - 文件下载功能需要超过 6 分钟,我该如何改进,在 google app 脚本中?

javascript - 使用 Google Drive API 导航到文件夹