使用Google脚本插入图像

我正在尝试使用Google脚本插入存储在我的Google驱动器上的图像,并希望将其插入到我的Google工作表中

请记住,我的驱动器中存储了一大堆图像,我并不是真的想发布到Web上,但确实想要一种自动执行此操作的方式。

我知道这个问题是在大约2/3年前被问到的,谷歌没有这样做的方法,有一些变通办法,比如出口链接,现在已经被削弱了。

我想到了intertimage(),但它似乎不适用于我。

这是我用来获取PDF和Tiff的代码,基本上是Tainik编写的代码

function insertDrawing(folderID, file_name) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var file = DriveApp.getFolderById(folderID).searchFiles('title contains "' + file_name + '"').next();
if (!~file.getMimeType().indexOf("pdf") || !~file.getMimeType().indexOf("tiff") || file == 'undefined') {
    ss.toast('No image found');
    return
} 
var res = (JSON.parse(UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + file.getId() + "?fields=thumbnailLink", {
    method: "GET",
    headers: {
        "Authorization": "Bearer " + ScriptApp.getOAuthToken()
    },
    muteHttpExceptions: true
}).getContentText()).thumbnailLink);
var r = res.split("=");
Logger.log(res)
var url = res.replace(r[r.length - 1], "s5000");
Logger.log([res, url])
return UrlFetchApp.fetch(url, {
    headers: {
        Authorization: "Bearer " + ScriptApp.getOAuthToken()
    }
}).getBlob()
}

解决方案

这个样本怎么样?在此示例中,使用图像文件的文件名将图像插入到活动工作表中。您可以在https://developers.google.com/apps-script/reference/spreadsheet/sheet#insertImage(Blob,Integer,Integer)查看insertImage()的详细信息。

示例脚本%1

SpreadsheetApp.getActiveSheet().insertImage(
  DriveApp.getFilesByName(filename).next().getBlob(),
  1,
  1
);

示例脚本2

如果您要在自己的Google Drive中插入所有文件,您可以使用以下脚本。但如果图像文件较多,则可能会出错。

var ss = SpreadsheetApp.getActiveSheet();
var files = DriveApp.getFiles();
var ar = [];
var i = 1;
while (files.hasNext()) {
  var file = files.next();
  if (~file.getMimeType().indexOf("image")) {
    ss.insertImage(DriveApp.getFileById(file.getId()).getBlob(), i++, 1);
  }
}

示例脚本3

insertImage()可以使用PNG、BMP、gif、jpeg等miyTypes。我认为这对应于getAs()。具有MimeType的图像(除它们之外)不能直接使用。因此,这些图像必须转换为MimeTypes。但是由于Google Apps脚本没有为它准备好的转换器,所以以前必须使用外部API来处理这种情况。最近,我注意到,可以通过更改查询参数来使用Drive API的thumbnailLink。您可以查看详细信息here。

关于样例脚本,我使用了以下内容。此脚本在特定文件夹中插入图像。您可以使用PNG、BMP、gif和jpeg等MimeTypes,也可以使用其他MimeTypes。虽然我认为分离PNG、BMP、GIF和JPEG以及除它们之外的图像效率很高,但当文件数量很大时,可能会出错。

var folderId = "### folder ID ###";
var ss = SpreadsheetApp.getActiveSheet();
var files = DriveApp.getFolderById(folderId).getFiles();
var ar = [];
var i = 1;
while (files.hasNext()) {
  var file = files.next();
  if (file.getMimeType() == "image/png" || file.getMimeType() == "image/bmp" || file.getMimeType() == "image/gif" || file.getMimeType() == "image/jpeg" || file.getMimeType() == "image/jpg") {
    ss.insertImage(DriveApp.getFileById(file.getId()).getBlob(), i++, 1);
  } else if (~file.getMimeType().indexOf("image")) {
    var res = JSON.parse(UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + file.getId() + "?fields=thumbnailLink", {
      method: "GET",
      headers: {
        "Authorization": "Bearer " + ScriptApp.getOAuthToken()
      },
      muteHttpExceptions: true
    }).getContentText()).thumbnailLink;
    var r = res.split("=");
    var url = res.replace(r[r.length - 1], "s5000");
    ss.insertImage(UrlFetchApp.fetch(url, {
      headers: {
        Authorization: "Bearer " + ScriptApp.getOAuthToken()
      }
    }).getBlob(), i++, 1);
  }
}

如果我误解了您的问题,很抱歉。

相关文章