使用 Google Apps 脚本将图像从云端硬盘插入 Google Spresheet 单元格

Ben*_*inK 0 google-sheets google-apps-script

我已经浏览了有关该主题的所有线程。从 blob 到 URL 等等,通过 apps-script 将图像插入单元格,但似乎没有任何效果。大多数帖子都没有给出足够好的解决方案来追溯错误。所以我想在这里找到我的问题的答案。下面是我的代码。我也很想讨论不同方法的优点。据我所知,在处理 G-Drive 中已有的图像时,Blob 似乎是最简单的之一。

function getGDriveFilesIntoCell() {

  var dApp = DriveApp;  // Store GDrive App in a function
  var folderIter = dApp.getFoldersByName("Training_folder");  // Get folder by name
  var foundfolder = folderIter.next();  // next allows to Iterate through the found folders
  Logger.log(foundfolder);  // Print into the logs the found folder of foundfolder

  var ss = SpreadsheetApp.getActiveSpreadsheet(); //.getActiveSheet();  // Calls the Spreadsheet App and the current active Spreadsheet
  var sheet = ss.getSheets()[0];  // Get first sheet

  var filesIter = foundfolder.getFiles();  // Get files in found folder

  var i = 1;  // Define a var with value 1

  while(filesIter.hasNext()){  // While loop for all files in folder found by name
    var file = filesIter.next();
    var filename = file.getName();  // Get Name
    var filesize = file.getSize() / 1024;  // Get size in kb
    var file_id = file.getId();  // Get ID
    var file_url = file.getUrl();  // Get Url to file
    sheet.insertImage(file.getBlob(), i, 1);  // Insert Image
    Logger.log(filename + filesize + file_id);
    Logger.log(filesize);
    Logger.log(file_id);
    i++;  // increment i by one

    // file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW)  // Set file permission

    // var file_blob = file.getBlob();  // Get blob

    // Insert Image via custom bblob
    // var file_mime_type = file.getMimeType();  // Get Mime Type
    // var response = UrlFetchApp.fetch(file_url);
    // var binaryData = response.getContent();
    // var blob = Utilities.newBlob(binaryData, file_mime_type, filename);
    // sheet.insertImage(blob, i, 1);

    // Inser image via Link
    // ss.getRange(i, 1).setValue("=image(\"https://drive.google.com/uc?export=view&id=" + file.getId() +"\")");  // Adds an Image via Link
    // var img = Drive.Files.get(file.getId()).webContentLink;
  }

}
Run Code Online (Sandbox Code Playgroud)

Tan*_*ike 8

我相信你的目标如下。

  • insertImage您想使用 blob将图像放入 Google 电子表格中。
  • 您想要从特定文件夹中检索图像。

为此,这个答案怎么样?

修改要点:

  • 将图像放入电子表格时,请注意以下几点。
    1. 在您的脚本中,当 文件夹中包含除图像之外的文件时Training_folder,会发生错误。
    2. 当图像大小超过最大限制时,会发生错误。参考号

我认为这些可能是您问题的原因。所以我想提出如下修改。

修改后的脚本:

当您的脚本修改时,请修改如下。在此修改中,使用 Google Apps 脚本库“ImgApp”。所以在运行脚本之前,请先安装GAS库。您可以在此处查看如何安装它。

从:

while(filesIter.hasNext()){  // While loop for all files in folder found by name
  var file = filesIter.next();
  var filename = file.getName();  // Get Name
  var filesize = file.getSize() / 1024;  // Get size in kb
  var file_id = file.getId();  // Get ID
  var file_url = file.getUrl();  // Get Url to file
  sheet.insertImage(file.getBlob(), i, 1);  // Insert Image
  Logger.log(filename + filesize + file_id);
  Logger.log(filesize);
  Logger.log(file_id);
  i++;  // increment i by one
}
Run Code Online (Sandbox Code Playgroud)

到:

while(filesIter.hasNext()){
  var file = filesIter.next();
  if (file.getMimeType().indexOf("image") != -1) {
    var blob = file.getBlob();
    var size = ImgApp.getSize(blob);
    if (size.width * size.height > 1048576) {
      var resized = ImgApp.doResize(file.getId(), 512);
      blob = resized.blob;
    }
    sheet.insertImage(blob, i, 1);  // Insert Image
    i++;  // increment i by one
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 在此修改后的脚本中,检索图像文件。并且,当图像大小超过电子表格的最大大小时,将调整图像大小。

笔记:

  • 从您的脚本中,您可以使用不带 V8 的脚本。所以我对其进行了修改。

参考:

  • 在这个问题上花了几个小时后,这是唯一对我有用的解决方案。谢谢@Tanaike。 (2认同)