几个月来,我一直在使用insertImage函数将保存在我的驱动器上的图像插入到Google表格中。今天,它已经停止工作,并出现以下错误消息:
Exception: The image could not be inserted. Please verify it is valid and try again.
一直有效的过程是获取文件ID,检索链接,从链接中获取图像并插入图像。下面的代码说明了这一点:
var blob = DriveApp.getFileById(fileID).getBlob()
var width = 340;
var link = Drive.Files.get(fileID).thumbnailLink.replace(/=s.+/, "=s" + width);
var blob2 = UrlFetchApp.fetch(link).getBlob()
var the_image = TemplateSheet.insertImage(blob2, 3, 13, 110, 0);
当我访问"链接"时我被引导到预期的图像。我也可以保存blob2;作为一个图像,并以其他方式使用它,没有任何错误。有人能帮助解决我收到的错误吗?
试试这个:
function myFunction() {
var blob = DriveApp.getFileById("fileid");
var width = 340;
//Insert and resize image
SpreadsheetApp.getActiveSheet().insertImage(blob, 3, 13, 110, 0).setWidth(width);
}
参考:
insertImage(url, column, row, offsetX, offsetY)
OverGridImage: setWidth ()
虽然在你的情况下,它(可能?)是一个有缺陷的表格,根据你对所选答案的评论-它不是在我的,所以这个答案是为其他人绊倒在这里。
我发现insertImage调用根本不可靠(由于一些未知和未确定的原因),并且不可避免地会不时失败。它很少在第一次使用时失败(我从未见过),但后续使用,特别是在循环中,必然会收到此错误。
我在try catch中包围了insertImage调用,然后用while包围了它。虽然这很糟糕,而且可能会导致无限循环(尽管谷歌应用程序脚本有一个艰难的6分钟杀死计时器——所以没什么大不了的),但它完成了工作,我已经厌倦了与它斗争。您可以随意使用for循环来尝试一定次数,或者使用调试器命令来查看是否可以进一步调试。
var insertSuccess = false;
var insertImageErrorMessage = "";
while (! insertSuccess )
{
try
{
*** insertImage call goes here ***
insertSuccess = true;
}
catch (e)
{
console.log(e.message);
insertImageErrorMessage=e.message;
}
}
编辑警告! !
这似乎是由某种"垃圾邮件保护"引起的。在谷歌,服务器端。我一开始尝试插入定时延迟以避免接收到错误消息,直到失败后才转向这种破解解决方案。要么是我尝试的延迟时间太小,要么是谷歌只是被任意数量的imageInsert请求所困扰——可能。
上面的解决方案工作了一段时间,然后突然(正如在这个线程中所描述的,以及脚本突然停止工作,但在其他表中工作)所有请求insertImage都被拒绝了相同的错误信息。据我所知,一旦发生这种情况-它是永久性的。
值得庆幸的是,它似乎与文档ID相关联-因此,创建一个新的副本(或可能恢复到以前的版本,上面链接线程中OP使用的解决方案)解决了问题-至少在您再次遇到此问题之前。
如果有"right"/"批准的方式这样做,我不知道它是什么,在文档中没有发现任何关于它。如果你知道什么,请在这里评论!