【问题标题】:Insert Image into a Google Sheet with Apps Script using base64 encoded data使用 base64 编码数据通过 Apps 脚本将图像插入 Google 表格
【发布时间】:2020-03-03 06:16:02
【问题描述】:

给定一个 png 文件的一些 base64 编码数据,如下面的图像标签示例所示。

<img src="data:image/png;base64,R0lGODlhDAAMAKIFAF5LAP/zxAAAANyuAP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOaGcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA7">

我需要为 insertImage() 方法从 base64 编码数据创建图像 blob。

sheetClass.insertImage(imageBlob, column, row)

文档: Sheets Class - insertImage method

我尝试使用下面的代码,但它会引发错误:

执行失败:从 URL 或错误 URL 检索图像时出错

文档指出该方法需要一个 blob,而不是 URL,但它似乎需要一个指向图像文件的链接。

function insertImageFromBase64Src() {
  var data = 'R0lGODlhDAAMAKIFAF5LAP/zxAAAANyuAP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOaGcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA7';

  var imageBlob = Utilities.newBlob(Utilities.base64Decode(data), 'image/png').getBytes();

  var ss = SpreadsheetApp.getActiveSpreadsheet();//This code is bound to a Sheet

  var po = {
    shName:'Update File',
    column:1,
    row:37
  }

  var sh = ss.getSheetByName(po.shName);

  var image = sh.insertImage(imageBlob, po.column, po.row);//Insert an image and return the image
}

【问题讨论】:

    标签: image google-apps-script google-sheets base64


    【解决方案1】:

    这个修改怎么样?

    修改点:

    • insertImage可以使用blob和URL,即图片文件的直接链接。

      • 在您的脚本中,imageBlob 是一个字节数组,即“number[]”。这样,我认为发生了错误。
    • 请将名称添加到 blob。

      • 如果没有给出名称,则会发生错误。

    修改后的脚本:

    当你的脚本被修改后,变成如下。

    function insertImageFromBase64Src2() {
      var data = 'R0lGODlhDAAMAKIFAF5LAP/zxAAAANyuAP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOaGcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA7';
    
      var imageBlob = Utilities.newBlob(Utilities.base64Decode(data), 'image/png', 'sample');  // Modified
    
      var ss = SpreadsheetApp.getActiveSpreadsheet();  //This code is bound to a Sheet
    
      var po = {
        shName:'Update File',
        column:1,
        row:37
      }
    
      var sh = ss.getSheetByName(po.shName);
    
      var image = sh.insertImage(imageBlob, po.column, po.row);//Insert an image and return the image
    }
    
    • 在本次修改中,假设data可以正确解码。

    参考资料:

    如果这不是您问题的直接解决方案,我深表歉意。

    【讨论】:

    • 谢谢。有用。有趣的是,如果删除了 blob 名称 sample,则会出现错误。因此,出于某种原因,insertImage 方法似乎期望 blob 有一个名称。
    • @Alan Wells 感谢您的回复。是的。另外,我认为如果可以通过图像的文件名检索电子表格上的图像,它可能有助于管理电子表格上的图像。
    • 好点。如果工作表中有多个图像,那么为每个图像命名将有助于识别它们。我还发现了另一个有趣的解决方案。我可以使用数据 url:var data = 'base64Encoded data here';var url = 'data:image/png;base64,' + data;sh = ss.getSheetByName(po.shName);var image = sh.insertImage(url, column, row); 但是该解决方案没有给图像命名。
    • @Alan Wells 感谢您回复并添加信息。我认为这是一个很好的方法。我原以为 URL 只能使用图像文件的直接链接。但是从您的附加信息中发现,数据图像的url也可以使用。在这种情况下,base64 数据在内部服务器上进行编码。所以我认为成本可能低于客户端编码的过程。
    • 我正在做的是对 base64 数据图像数据进行硬编码,以避免对图像 url 的外部请求或读取 Google Drive 以获取图像文件。我正在尝试创建一个具有尽可能少的权限的附加组件。如果有一种方法可以从 html 中获取 base64 数据,那就太好了。 var html = "&lt;button&gt;Submit&lt;/button&gt;"; 显然,按钮的 html 是比 base64 数据少得多的硬编码数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多