首页 > 解决方案 > 在 Google 工作表中插入图像,并使用工作表中的自定义功能

问题描述

我正在尝试创建一个谷歌电子表格,它将列出并显示我玩的游戏中的生物。

在这个项目中,我有自定义函数,您可以从电子表格中调用,如下所示:

=getAllMons("" ,"","" ,"" ,"" ,4, "beast","", "" ,"", "", "", "tail-the-last-one", "horn-imp")

具有多个不同的搜索参数。

我的问题是第一列应该包含怪物的图像。我认为当从工作表中调用 geAllMons 时,将数组中的公式构建为字符串会起作用并渲染图像。但它没有

这是我的数组中一行的示例:

var Stats = [ '=image(\"' +a.image +'\", 1)', a.id, a.name, a.class, a.stage,
              a.level, a.exp, a.pendingExp, a.breedable, a.breedCount ,
              a.stats.hp, a.stats.speed, a.stats.skill, a.stats.morale,
              a.parts[0].name, a.parts[0].class, a.parts[0].type, a.parts[0].stage,
              a.parts[1].name, a.parts[1].class, a.parts[1].type, a.parts[1].stage,
              a.parts[2].name, a.parts[2].class, a.parts[2].type, a.parts[2].stage,
              a.parts[3].name, a.parts[3].class, a.parts[3].type, a.parts[3].stage,
              a.parts[4].name, a.parts[4].class, a.parts[4].type, a.parts[4].stage,
              a.parts[5].name, a.parts[5].class, a.parts[5].type, a.parts[5].stage,
              a.owner, a.sireId, a.matronId, a.birthDate, a.title
            ];

我很确定问题是内容仍处于活动公式中,因为当我选择整个数据并将粘贴复制为纯文本时。图像公式得到处理,我得到图像。当我从谷歌应用程序脚本编辑器运行我的函数时,它也可以工作,但这不是一个解决方案,因为我不希望人们每次想要搜索不同的东西时都必须进入脚本编辑器,也不太直观。

我已经搜索过,大多数解决方案是您从脚本编辑器运行的自定义函数,并将图像附加到新行或使用 setValue、setImage 的方法。那些不适用于表内自定义功能。

任何机构有一个想法?将不胜感激。

这是我得到的: 在此处输入图像描述

我应该得到什么: 在此处输入图像描述

标签: google-apps-scriptgoogle-sheets

解决方案


正如 Tanaike 所说,您不能使用自定义函数在单元格中设置公式。不过幸运的是,有几种方法可以作为解决方法,其有效性取决于您在此处所需的工作流程:

解决方法 1

根据您的喜好,您可以使用onEdit 触发器,该触发器仅在编辑的单元格位于第一列和所需工作表中时才会触发(Sheet1在下面的示例中调用,请相应更改)。想法是,您将函数中的所有参数写入函数中,例如用逗号分隔,并且由版本触发的函数将使用split将字符串分隔为不同的值,并将它们写入不同的列中。在第一列中,对应于图像,setFormula可以并且将会成功使用。像这样的东西:

function onEdit(e) {
  var cell = e.range;
  var sheet = cell.getSheet();
  var row = cell.getRow();
  if (cell.getColumn() == 1 && sheet.getName() == "Sheet1") {
    var value = cell.getValue();
    var values = value.split(",");
    cell.setFormula("=image(\"" + values[0] + "\")");
    for (var col = 1; col < values.length; col++) {
      sheet.getRange(row, col + 1).setValue(values[col]);
    }
  }
}

解决方法 2

一个需要更多努力但根据您的情况可能更合适的选项是使用一个侧边栏,其中包含将添加form来自的所有数据的位置。monster提交表单时,此数据将写入电子表格中指示的行中。

下面是一个怪物数据只有三个字段的示例,但这对于理解这个想法很有用。

首先,在打开电子表格时创建一个自定义菜单(通过 onOpen 触发器),该菜单将用于显示带有表单的侧边栏:

function onOpen() {
  SpreadsheetApp.getUi()
      .createMenu('Custom Menu')
      .addItem('Add monster', 'showSidebar')
      .addToUi();
}

单击该选项时,会从文件Add monster中生成一个侧边栏:html

function showSidebar() {
  var html = HtmlService.createHtmlOutputFromFile('sidebar')
    .setTitle('Set new monster')
    .setWidth(300)
  SpreadsheetApp.getUi()
      .showSidebar(html);
}

这是创建侧边栏的 html 文件:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <form onsubmit="handleFormSubmit(this)">
      <label for="row">Choose a row to write monster data</label>
      <input type="number" name="row"><br>
      <label for="image">Add a monster image url</label>
      <input type="text" name="image"><br>
      <label for="id">Add the monster id</label>
      <input type="number" name="id"><br>
      <label for="name">Add the monster name</label>
      <input type="text" name="name"><br>
      <input type="submit" value="Submit">
    </form>
  </body>

  <script>
    function handleFormSubmit(formObject) {
      google.script.run.addMonster(formObject);
    }  
  </script>
</html>

该文件包含一个form要添加的字段(要编辑的行索引和要添加的怪物对应的数据)。此外,当提交表单时,会触发一个addMonster从表单获取数据作为参数 ( ) 的函数:formObject

function addMonster(data) {
  var row = data["row"];
  var url = data["image"];
  var id = data["id"];
  var name = data["name"];
  var sheet = SpreadsheetApp.getActive().getSheetByName("Sheet1");
  sheet.getRange(row, 1).setFormula("=image(\"" + url + "\")");
  sheet.getRange(row, 2).setValue(id);
  sheet.getRange(row, 3).setValue(name);
}

最后一个函数从表单中获取数据并将其写入表单本身指示的行中。这样,您就可以成功地使用setFormula来显示图像了。

请记住,这是一个非常简化的示例,可以通过多种方式进行扩展和改进。它的目的只是为了展示这背后的想法。

我希望这有任何帮助。


推荐阅读