使用应用脚本将图像插入Google文档时,图像数据无效

时间:2019-04-02 02:27:56

标签: google-apps-script google-docs

我正在尝试将Google云端硬盘文件夹中的所有图像插入Google文档。但是在insertImage上,我总是收到“无效的图像数据”错误。

function myFunction() {
  var folder = DriveApp.getFolderById(id);
  var files = folder.getFiles();
  while (files.hasNext()) {
     var file = files.next();
     var img = file.getBlob();
     var imgDoc = DocumentApp.getActiveDocument().getBody().insertImage(0, img);  
   }
}

有许多示例说明了如何执行此操作,并且所有人都说要获取图像斑点并将其插入。这段代码中是否存在某些错误的图像斑点?

1 个答案:

答案 0 :(得分:2)

这个答案怎么样?

假设和实验:

根据我的实验,在电子表格中,当insertImage()在班级表中插入图片时,限制是由于图片区域(像素^ 2)而不是图片的文件大小。可以插入的最大图像区域为1,048,576像素^ 2。 Ref

从这种情况出发,我认为您的问题还与电子表格的情况有关。类insertImage()中的限制可能是由于图像的区域。所以我做了如下实验。

  • 可以插入以下尺寸的图像。

    • 5000像素x 5000像素
    • 25000像素x 1000像素
    • 1000像素x 25000像素
  • 以下尺寸的图像无法插入。

    • 5001像素x 5001像素
    • 5000像素x 5001像素
    • 5001像素x 5000像素

结果,发现区域限制为25,000,000像素^ 2。

关于您的问题:

在您的情况下,共享图像的图像尺寸为6240像素x 4160像素。该区域是25,958,400像素^ 2。该区域大于以上实验获得的值(25,000,000像素^ 2)。这样,可以认为是发生了错误。

解决方法:

为了避免此限制,该解决方法如何?在这种解决方法中,当图像大小大于25,000,000像素^ 2时,将使用Drive API减小图像大小。修改后的脚本如下。

修改后的脚本:

function myFunction() {
  var folder = DriveApp.getFolderById(id);
  var files = folder.getFiles();
  while (files.hasNext()) {
     var file = files.next();
     var img = file.getBlob();

     // --- Following script was added.
     var url = "https://www.googleapis.com/drive/v3/files/" + file.getId() + "?fields=imageMediaMetadata(height%2Cwidth)%2CthumbnailLink&access_token=" + ScriptApp.getOAuthToken();
     var res = UrlFetchApp.fetch(url).getContentText();
     var obj = JSON.parse(res);
     if (obj.imageMediaMetadata && (obj.imageMediaMetadata.width * obj.imageMediaMetadata.height) > 25000000) {
       var width = 1000;
       var tlink = obj.thumbnailLink.replace(/=s\d+/, "=s" + width);
       img = UrlFetchApp.fetch(tlink).getBlob();
     }
     // ---

     var imgDoc = DocumentApp.getActiveDocument().getBody().insertImage(0, img);
   }
}
  • 在本变型中,作为示例,图像尺寸随着1000像素的宽度而减小。如果要修改此设置,请修改var width = 1000
  • 我认为在您的脚本中,由于使用了DriveApp类,因此已经自动启用了Drive API。但是,如果发生与Drive APi相关的错误,请检查是否在API控制台上启用了Drive API。

参考: