如何从谷歌应用程序脚本访问新的“in-cell-image”?

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 知道您也喜欢此功能,并且会自动获取有关其进度的更新。

我希望这对你有帮助!

  • 有更新吗?如果我们仍然无法获取图像,是否至少有一种方法可以测试单元格中是否有图像(而不是公式)? (3认同)

Tan*_*ike 6

我相信你的目标如下。

  • 您想使用 Google Apps 脚本检索 Google 电子表格单元格中的图像。

问题和解决方法:

不幸的是,在当前阶段,没有方法可以在电子表格服务和表格 API 中检索电子表格上的单元格中的图像。Rafa Guillermo 的回答已经提到了这一点。所以在这个答案中,我想提出一种使用 Google Apps Script 检索单元格中图像的解决方法。

在此解决方法中,我使用从 Google 电子表格转换而来的 Microsoft Excel 数据。即使将 Google 电子表格转换为 Microsoft Excel 数据,单元格中的图像也不会被删除。我用这个。当然,也可以从电子表格转换的 HTML 数据中检索图像。但是在这种情况下,HTML 数据的解析比 Excel 数据的解析要复杂一些。所以在这里,我想建议从电子表格转换的 Excel 数据中检索图像。此变通方法的流程如下。

  1. 使用 Drive API 将 Google 电子表格转换为 Microsoft Excel(XLSX 数据)。
  2. 使用 Google Apps 脚本解析 XLSX 数据。
    • 将转换后的 XLSX 数据解压缩后,可以将数据作为 XML 数据进行分析。幸运的是,在 Microsoft Docs,详细规范作为 Open XML 发布。因此,在这种情况下,可以使用 Google Apps Script 的 XmlService 分析 XLSX、DOCX 和 PPTX 等 Microsoft Docs。我认为这种方法对于其他情况也很有用。
  3. 从 XLSX 数据中检索图像。

模式一:

在这个模式中,我想介绍一个简单的方法。

示例脚本:

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)
  • 在此示例脚本中,电子表格中的所有图像都导出为文件。因此,在这种情况下,将检索来自电子表格中所有工作表的单元格中和单元格上的图像。而且,它无法检索图像在单元格中的单元格坐标。
    • 在当前阶段,没有将 Google 电子表格中的图像作为 blob 检索的方法。在这个示例脚本中,这可以实现。
  • 此示例脚本无法导出图纸。请注意这一点。
  • setContentType(MimeType.ZIP)不使用时,在发生了错误Utilities.unzip(blob)。请注意这一点。

模式2:

在此模式中,使用电子表格中的工作表名称和单元格坐标检索图像。在这种情况下,脚本变得有点复杂。所以在这里,我想介绍一下使用 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)
  • 在此示例中,检索活动电子表格中“Sheet1”的单元格“A1”中的图像,并将检索到的 blob 作为图像文件创建到根文件夹。

笔记:

  • 在当前阶段,当一张图片插入到Google电子表格中并且电子表格被转换为XLSX数据时,包含XLSX数据的图片的文件名是image1, image2,, ,这不是原始文件名。所以这似乎是当前的规范。
  • 当从 XLSX 数据中检索图像时,图像似乎与原始图像有些不同。图像格式相同。但是数据量比原来的要小。当图像大小超过 2048 像素和 72 dpi 时,图像被修改为 2048 像素和 72 dpi。即使图像大小小于 2048 像素和 72 dpi,文件大小也会比原始文件小。所以我认为图像可能被压缩。请注意这一点。
  • 现阶段无法直接检索图纸。

参考:

  • 很好的解决方法。(PS:对于自我 github 链接,请考虑添加一个信息,表明您是该库的作者) (2认同)
  • 精彩的答案! (2认同)
  • @TonyM 我认为你也应该将其发布为答案。 (2认同)
  • @Tony M 所以我对您提出的“发布工作表并下载 html 以访问子文件夹中的图像的解决方法”的建议感兴趣。因为我认为解析 HTML 对我来说很难。那么您可以发布详细信息作为答案吗?这样,它将对其他用户有用。我想从你的回答中学习。 (2认同)

Kos*_*Kos 5

现已于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。