google-apps-script - 在 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 种方法都不会显示缩略图。
我没有看到重复的问题和答案来帮助我找出我的代码有什么问题,或者帮助我以某种方式在电子表格中获取所需的缩略图。善意提出的解决方案还没有成功。
解决方案
尝试这样的事情:
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;
}
}
推荐阅读
- android - 停止来自不同活动的警报
- javascript - 对来自 SharePoint RestAPI 的结果进行排序
- javascript - Django 动态表单集:正确使用内联表单集?
- mysql - 为什么执行 count() 会返回带有回溯的 PhpMyAdmin 错误
- vue.js - 导航选项卡重新加载页面
- vue.js - 在自定义指令中模拟 v-if 指令
- c++ - 特征:如何将“大于”(在 ArrayXf 上)的结果转换为特征向量
- spring - java.lang.IllegalArgumentException:在方法名称中发现无效字符。HTTP 方法名称必须是微服务中的标记
- ios - iOS中的堆栈视图问题
- java - 如何修复此异常不匹配错误?