Tho*_*eek 9 google-sheets google-apps-script
Google 表格中的新函数插入 > 图像 > 单元格中的图像将图像插入单元格中,而不是作为 OverGridImage。我想以这种方式插入图像,然后从 Google Apps 脚本访问图像。这可能吗?
插入图像后,选择单元格时,单元格的公式为空白。我尝试搜索 GAS 参考资料,但找不到有关此相对较新功能的任何信息。有关于过网格图像的信息。我希望内嵌图像具有类似的功能。
我试过这样的事情:
// See what information is available on a cell with inserted image:
var image = sheet.getRange(1, 1).getFormula();
Logger.log(image);
Run Code Online (Sandbox Code Playgroud)
日志显示为空。我尝试了几个:.getImage()(不存在)、.getValue()、.getFormula()
我希望能够以某种方式访问图像 URL 或 Blob。
Raf*_*rmo 10
这是一个新功能,不幸的是,目前还没有一种方法可以使用 Google Apps Script 或 Sheets API 以这种方式将图像插入到单元格中。
尝试使用spreadsheets.get具有以下参数的方法获取单元格中的数据
spreadsheetId: "ID of private spreadsheet created in Drive"
includeGridData: True
ranges: D7
fields: sheets/data/rowData/values
Run Code Online (Sandbox Code Playgroud)
将返回 a 200 response,但不返回图像数据:
{
"sheets": [
{
"data": [
{
"rowData": [
{
"values": [
{
"userEnteredValue": {},
"effectiveValue": {},
"effectiveFormat": {
"backgroundColor": {
"red": 1,
"green": 1,
"blue": 1
},
"padding": {
"top": 2,
"right": 3,
"bottom": 2,
"left": 3
},
"horizontalAlignment": "LEFT",
"verticalAlignment": "BOTTOM",
"wrapStrategy": "OVERFLOW_CELL",
"textFormat": {
"foregroundColor": {},
"fontFamily": "Arial",
"fontSize": 10,
"bold": false,
"italic": false,
"strikethrough": false,
"underline": false
},
"hyperlinkDisplayType": "PLAIN_TEXT"
}
}
]
}
]
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,您可以在此处找到 Google 的问题跟踪器上对此的功能请求。如果您转到功能请求页面并单击左上角的星标,您可以让 Google 知道您也喜欢此功能,并且会自动获取有关其进度的更新。
我希望这对你有帮助!
我相信你的目标如下。
不幸的是,在当前阶段,没有方法可以在电子表格服务和表格 API 中检索电子表格上的单元格中的图像。Rafa Guillermo 的回答已经提到了这一点。所以在这个答案中,我想提出一种使用 Google Apps Script 检索单元格中图像的解决方法。
在此解决方法中,我使用从 Google 电子表格转换而来的 Microsoft Excel 数据。即使将 Google 电子表格转换为 Microsoft Excel 数据,单元格中的图像也不会被删除。我用这个。当然,也可以从电子表格转换的 HTML 数据中检索图像。但是在这种情况下,HTML 数据的解析比 Excel 数据的解析要复杂一些。所以在这里,我想建议从电子表格转换的 Excel 数据中检索图像。此变通方法的流程如下。
在这个模式中,我想介绍一个简单的方法。
function myFunction() {
const spreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId();
const url = "https://docs.google.com/spreadsheets/export?exportFormat=xlsx&id=" + spreadsheetId;
const blob = UrlFetchApp.fetch(url, {headers: {authorization: `Bearer ${ScriptApp.getOAuthToken()}`}}).getBlob().setContentType(MimeType.ZIP);
const xlsx = Utilities.unzip(blob);
xlsx.forEach(b => {
const name = b.getName().match(/xl\/media\/(.+)/);
if (name) DriveApp.createFile(b.setName(name[1]));
});
}
Run Code Online (Sandbox Code Playgroud)
setContentType(MimeType.ZIP)不使用时,在发生了错误Utilities.unzip(blob)。请注意这一点。在此模式中,使用电子表格中的工作表名称和单元格坐标检索图像。在这种情况下,脚本变得有点复杂。所以在这里,我想介绍一下使用 Google Apps 脚本库的示例脚本。Ref当然,你可以在那里看到整个脚本。
在您使用这个脚本之前,请先安装DocsServiceApp(这个 GAS 库的作者是 tanaike。)Google Apps Script 库。Ref并运行myFunction.
function myFunction() {
const cell = "A1";
const sheetName = "Sheet1";
const spreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId();
const obj = DocsServiceApp.openBySpreadsheetId(spreadsheetId).getSheetByName(sheetName).getImages();
console.log(obj)
const blobs = obj.filter(({range, image}) => range.a1Notation == cell && image.innerCell);
console.log(blobs.length)
if (blobs.length > 0) DriveApp.createFile(blobs[0].image.blob);
}
Run Code Online (Sandbox Code Playgroud)
image1, image2,, ,这不是原始文件名。所以这似乎是当前的规范。现已于2022 年 1 月推出(发行说明):
电子表格服务中添加了以下类,以便您将图像添加到单元格中:
- CellImageBuilder:此构建器创建将图像添加到单元格所需的图像值。
- CellImage:表示要添加到单元格的图像。
要将图像添加到单元格,您必须使用
SpreadsheetApp.newCellImage()和为图像创建新的图像值CellImageBuilder。然后,使用Range.setValue(value)或Range.setValues(values)将图像值添加到单元格中。
例子:
function insertImageIntoCell()
{
let image = SpreadsheetApp.newCellImage().setSourceUrl('https://www.gstatic.com/images/branding/product/2x/apps_script_48dp.png').setAltTextDescription('Google Apps Script logo').toBuilder().build();
SpreadsheetApp.getActive().getActiveSheet().getRange('A1').setValue(image);
}
Run Code Online (Sandbox Code Playgroud)
结果:
function getImageFromCell()
{
let value = SpreadsheetApp.getActive().getActiveSheet().getRange('A1').getValue();
console.log(value.getAltTextDescription());
console.log(value.getUrl());
}
Run Code Online (Sandbox Code Playgroud)
结果:
注意:此特定示例的getUrl返回null,这似乎是由于某些内部 API 不可用,来自文档:
获取图片的源URL;如果 URL 不可用,则返回 null。如果图像是使用 API 通过 URL 插入的,则此方法返回图像插入期间提供的 URL。