首页 > 解决方案 > 在 Google 表格中显示缩略图

问题描述

下面的代码为工作表生成 IMAGE 函数,以显示所选文件夹中所有 (PDF) 文件的缩略图,通过 URL 和文件 ID 获得:

function scannedMail() {
  var files, file, sheet;
  sheet = SpreadsheetApp.getActive().getSheetByName('ScannedMail');

  files = DriveApp.getFoldersByName("ScannedMail").next().searchFiles('');
  var i = 1;
  while (files.hasNext()) {
    var file = files.next();
    var ID = file.getId();
    sheet.getRange('A' + i).setValue("=IMAGE(\"https://drive.google.com/thumbnail?authuser=0&sz=w320&id=" + ID + "\"\)");
    sheet.getRange('B' + i).setValue(file.getName());
    i=i+1;
  }
}

但是它没有显示缩略图。我发现它只显示了我通过获取“可共享链接”手动检索 ID 的那些。显然,这确保了正确的共享设置来获取我自己文件的缩略图。

1)之前的假设是否正确,为什么我需要以某种方式调整共享设置,我已经阅读了其他文件而没有任何问题?

2) 我如何调整脚本以调整共享设置,或使其以其他方式工作?该脚本旨在仅在我自己的 Google 帐户中运行,并将文件保密。

我尝试与自己共享文件夹,但这没有任何区别(或意义)。该脚本是否以某种方式被认为是我自己以外的另一个用户?

根据@Rubén 和@Cooper 的建议,我尝试使用insertImage基于 URL: sheet.insertImage(file.thumbnailLink, 1, i) 或基于 blob: sheet.insertImage(file.getThumbnail(), 1, i)

但我能从谷歌得到的最多的是“我们很抱歉,发生了服务器错误。请稍等,然后再试一次”,代码如下:

function ScannedMail() {
  var files, file, , name, blob, sheet;
  sheet = SpreadsheetApp.getActive().getSheetByName('ScannedMail');
  files = DriveApp.getFoldersByName("ScannedMail").next().searchFiles('');
  var i = 1;
  while (files.hasNext()) {
    file = files.next();
    name = file.getName();  //not needed, just for debugging
    blob = file.getThumbnail();
    sheet.insertImage(blob, 1, i);  // it runs up to here...
    i = i + 1;
  }
}

代码执行卡在第一次出现insertImage(). 因此,我们有 3 种方法(IMAGE工作表中的函数insertImage(URL,1,1)、 和insertImage(blob,1,1)),但除了公开文件时的第一种方法(不是一个严肃的选择)之外,所有 3 种方法都不会显示缩略图。

我没有看到重复的问题和答案来帮助我找出我的代码有什么问题,或者帮助我以某种方式在电子表格中获取所需的缩略图。善意提出的解决方案还没有成功。

标签: google-apps-scriptgoogle-sheetsgoogle-drive-api

解决方案


尝试这样的事情:

function imgArray() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('ImageArray');
  if(!sh){
    sh=ss.insertSheet('ImageArray');
  }
  var imgA=[];
  var folder=DriveApp.getFolderById('folderid');
  var files=folder.getFiles();
  while(files.hasNext()){
    var file=files.next();
    var filename=file.getName();
    imgA.push(file.getBlob());

  }
  for(var r=0;r<imgA.length;r++){
    sh.insertImage(imgA[r],1,r+1);
  }
}

这是改编自@Tanaike 的回答。

我想这就是你要找的:

function ScannedMail() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('ScannedMail');
  var files = DriveApp.getFoldersByName("ScannedMail").next().searchFiles('');
  var i = 1;
  while (files.hasNext()) {
    var file = files.next();
    var blob = file.getBlob();
    sheet.insertImage(blob, 1, i);  // it runs up to here...
    i = i + 1;
  }
}

推荐阅读