getBlob() 导致 "Invalid image data." 错误。 Google 应用程序脚本
getBlob() causing "Invalid image data." Error. Google Apps Script
我的 objective 是。
- 从 google 文档中获取 base64 图像字符串
- 将其作为图像保存到驱动器
- 从图像中获取 blob,并将新图像插入到与真实图像相同的文档中。
function getImage(doc) {
var tempBase64 = doc.getBody().getParagraphs()[doc.getBody().getParagraphs().length - 1].getText();
var base64 = tempBase64.replace("data:image/svg+xml;base64,", "");
var decoded = Utilities.base64Decode(base64);
return decoded;
}
function run() {
var doc = DocumentApp.getActiveDocument();
var img = getImage(doc); //returns decoded blob
var body = DocumentApp.getActiveDocument().getBody();
//gets the name of the current doc
var filename = DriveApp.getFileById(DocumentApp.getActiveDocument().getId());
var blobImg = Utilities.newBlob(img, MimeType.SVG, filename);
var currentFolder = DriveApp.getFolderById("1UuP2vZNXLVtgrZxAHLSNZUqVnx0xeSgW");
//saves image as same name
var newimg = currentFolder.createFile(blobImg).getId();
//wait for image to save
Utilities.sleep(5 * 1000);
// get blob
var blob = DriveApp.getFileById(newimg).getBlob();
var cursor = doc.getCursor();
if (cursor) {
//insert in to doc
cursor.insertInlineImage(blob);
}
}
function onOpen() {
run();
}
目前正在读取文档并获取 base64 字符串 ✓
例如:
image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIiB3aWR0aD0iMTIiIGhlaWdodD0iMTUiPjxwYXRoIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9InJnYigwLCAwLCAxMzkpIiBmaWxsPSJub25lIiBkPSJNIDEgMyBsIDEgNCIvPjxwYXRoIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9InJnYigwLCAwLCAxMzkpIiBmaWxsPSJub25lIiBkPSJNIDggMSBsIDEgMSIvPjxwYXRoIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9InJnYigwLCAwLCAxMzkpIiBmaWxsPSJub25lIiBkPSJNIDMgMTAgYyAwLjAyIDAuMDcgMC4zMSAzLjU0IDEgNCBjIDAuODQgMC41NiAzLjg5IDAuNDcgNSAwIGMgMC44IC0wLjM0IDIgLTMgMiAtMyIvPjwvc3ZnPg==
它正在以图像形式保存在特定文件夹中 ✓
返回新图片的id。✓
正在将图像作为 blob ✓
在插入图像时,我收到无效的图像数据。 (第 20 行,文件“代码”)。根本不知道如何解决。有人帮忙吗?
我认为你的脚本是正确的。只有一个问题。目前阶段,mimeType为image/svg+xml
的图片还不能直接插入到Google文档中。所以需要从svg图片转换成其他mimeType。在此修改中,我使用 Drive API 转换为 image/png
。还有几个 APIs,不是 Google APIs,用于将 svg 转换为其他格式。我认为您的情况有几种解决方法。所以请把这当作其中之一。
修改点:
- 从创建的文件中检索文件 ID 并使用驱动器检索缩略图链接 API。
- 调整link的图片大小后,获取PNG的图片blob。
- 已经发现通过修改
=s###
的查询参数,可以修改图片大小。我用过这个。 Ref
- 将 PNG blob 放入文档。
修改后的脚本:
在这个修改后的脚本中,run()
被修改了。请确认以下修改后的脚本。
function run() {
var doc = DocumentApp.getActiveDocument();
var img = getImage(doc); //returns decoded blob
var body = DocumentApp.getActiveDocument().getBody();
//gets the name of the current doc
var filename = DriveApp.getFileById(DocumentApp.getActiveDocument().getId());
var blobImg = Utilities.newBlob(img, MimeType.SVG, filename);
var currentFolder = DriveApp.getFolderById("1UuP2vZNXLVtgrZxAHLSNZUqVnx0xeSgW");
//saves image as same name
var newimg = currentFolder.createFile(blobImg).getId();
//wait for image to save
Utilities.sleep(5 * 1000);
// get blob
// --- Added --- Begin
var width = 300; // width of the image. A value of 300 pixels was used as a sample.
var url = "https://www.googleapis.com/drive/v3/files/" + newimg + "?fields=thumbnailLink&access_token=" + ScriptApp.getOAuthToken();
var link = JSON.parse(UrlFetchApp.fetch(url).getContentText()).thumbnailLink.replace(/=s\d+/, "=s" + width);
var blob = UrlFetchApp.fetch(link).getBlob();
// --- Added --- End
var cursor = doc.getCursor();
if (cursor) {
//insert in to doc
cursor.insertInlineImage(blob);
}
}
注:
- Drive 无法检索 svg 图片的宽度和高度 API。所以在这次修改中,我使用了恒定的宽度。
- 我觉得在你的脚本中,可以使用Drive API。但是,如果发生与 API 相关的错误,请在 API 控制台启用驱动器 API。
参考:
如果这不是您想要的结果,我深表歉意。
我的 objective 是。
- 从 google 文档中获取 base64 图像字符串
- 将其作为图像保存到驱动器
- 从图像中获取 blob,并将新图像插入到与真实图像相同的文档中。
function getImage(doc) {
var tempBase64 = doc.getBody().getParagraphs()[doc.getBody().getParagraphs().length - 1].getText();
var base64 = tempBase64.replace("data:image/svg+xml;base64,", "");
var decoded = Utilities.base64Decode(base64);
return decoded;
}
function run() {
var doc = DocumentApp.getActiveDocument();
var img = getImage(doc); //returns decoded blob
var body = DocumentApp.getActiveDocument().getBody();
//gets the name of the current doc
var filename = DriveApp.getFileById(DocumentApp.getActiveDocument().getId());
var blobImg = Utilities.newBlob(img, MimeType.SVG, filename);
var currentFolder = DriveApp.getFolderById("1UuP2vZNXLVtgrZxAHLSNZUqVnx0xeSgW");
//saves image as same name
var newimg = currentFolder.createFile(blobImg).getId();
//wait for image to save
Utilities.sleep(5 * 1000);
// get blob
var blob = DriveApp.getFileById(newimg).getBlob();
var cursor = doc.getCursor();
if (cursor) {
//insert in to doc
cursor.insertInlineImage(blob);
}
}
function onOpen() {
run();
}
目前正在读取文档并获取 base64 字符串 ✓ 例如:
image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIiB3aWR0aD0iMTIiIGhlaWdodD0iMTUiPjxwYXRoIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9InJnYigwLCAwLCAxMzkpIiBmaWxsPSJub25lIiBkPSJNIDEgMyBsIDEgNCIvPjxwYXRoIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9InJnYigwLCAwLCAxMzkpIiBmaWxsPSJub25lIiBkPSJNIDggMSBsIDEgMSIvPjxwYXRoIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9InJnYigwLCAwLCAxMzkpIiBmaWxsPSJub25lIiBkPSJNIDMgMTAgYyAwLjAyIDAuMDcgMC4zMSAzLjU0IDEgNCBjIDAuODQgMC41NiAzLjg5IDAuNDcgNSAwIGMgMC44IC0wLjM0IDIgLTMgMiAtMyIvPjwvc3ZnPg==
它正在以图像形式保存在特定文件夹中 ✓
返回新图片的id。✓
正在将图像作为 blob ✓
在插入图像时,我收到无效的图像数据。 (第 20 行,文件“代码”)。根本不知道如何解决。有人帮忙吗?
我认为你的脚本是正确的。只有一个问题。目前阶段,mimeType为image/svg+xml
的图片还不能直接插入到Google文档中。所以需要从svg图片转换成其他mimeType。在此修改中,我使用 Drive API 转换为 image/png
。还有几个 APIs,不是 Google APIs,用于将 svg 转换为其他格式。我认为您的情况有几种解决方法。所以请把这当作其中之一。
修改点:
- 从创建的文件中检索文件 ID 并使用驱动器检索缩略图链接 API。
- 调整link的图片大小后,获取PNG的图片blob。
- 已经发现通过修改
=s###
的查询参数,可以修改图片大小。我用过这个。 Ref
- 已经发现通过修改
- 将 PNG blob 放入文档。
修改后的脚本:
在这个修改后的脚本中,run()
被修改了。请确认以下修改后的脚本。
function run() {
var doc = DocumentApp.getActiveDocument();
var img = getImage(doc); //returns decoded blob
var body = DocumentApp.getActiveDocument().getBody();
//gets the name of the current doc
var filename = DriveApp.getFileById(DocumentApp.getActiveDocument().getId());
var blobImg = Utilities.newBlob(img, MimeType.SVG, filename);
var currentFolder = DriveApp.getFolderById("1UuP2vZNXLVtgrZxAHLSNZUqVnx0xeSgW");
//saves image as same name
var newimg = currentFolder.createFile(blobImg).getId();
//wait for image to save
Utilities.sleep(5 * 1000);
// get blob
// --- Added --- Begin
var width = 300; // width of the image. A value of 300 pixels was used as a sample.
var url = "https://www.googleapis.com/drive/v3/files/" + newimg + "?fields=thumbnailLink&access_token=" + ScriptApp.getOAuthToken();
var link = JSON.parse(UrlFetchApp.fetch(url).getContentText()).thumbnailLink.replace(/=s\d+/, "=s" + width);
var blob = UrlFetchApp.fetch(link).getBlob();
// --- Added --- End
var cursor = doc.getCursor();
if (cursor) {
//insert in to doc
cursor.insertInlineImage(blob);
}
}
注:
- Drive 无法检索 svg 图片的宽度和高度 API。所以在这次修改中,我使用了恒定的宽度。
- 我觉得在你的脚本中,可以使用Drive API。但是,如果发生与 API 相关的错误,请在 API 控制台启用驱动器 API。
参考:
如果这不是您想要的结果,我深表歉意。