Google apps script 使用sheet it self的自定义功能在google工作表中插入图像

Google apps script 使用sheet it self的自定义功能在google工作表中插入图像,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在尝试创建一个谷歌电子表格,列出并显示我玩的游戏中的生物 在本项目中,我有一个自定义函数,您可以从电子表格中调用该函数,如下所示: function onEdit(e) { var cell = e.range; var sheet = cell.getSheet(); var row = cell.getRow(); if (cell.getColumn() == 1 && sheet.getName() == "Sheet1") { var val

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

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

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]);
    }
  }
}
=getAllMons,,,4,野兽,,,尾巴最后一个,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
            ];
我很确定问题在于内容仍然在活动公式中,因为当我选择整个数据并以纯文本形式复制粘贴时。图像公式得到处理,我得到图像。 当我在谷歌应用程序脚本编辑器中运行我的函数时,它也可以工作,但这不是一个解决方案,因为我不希望人们每次都要在脚本编辑器中搜索不同的东西,也不太直观

我已经搜索过了,大多数解决方案都是自定义函数,您可以从脚本编辑器运行该函数,并将图像附加到新行,或者使用方法设置值setImage。 这些函数不适用于表内自定义函数

有人有主意吗?非常感谢

以下是我得到的:

我应该得到的是:

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

解决方法1 根据您的首选项,您可以使用仅当编辑的单元格位于下例中的第一列和所需的Sheet1表中时才会触发的,请相应更改。这样做的想法是,您在函数中写入所有参数,例如,用逗号分隔,由版本触发的函数将用于将字符串分隔为不同的值,并将它们写入不同的列中。在第一列中,对应于图像,可以并且将被成功使用。大概是这样的:

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]);
    }
  }
}
单击“添加怪物”选项时,会从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>
最后一个函数从表单获取数据,并将其写入表单本身所指示的行中。这样,您就可以成功地使用setFormula显示图像

请记住,这是一个非常简单的示例,可以在许多方面进行扩展和改进。它的目的只是为了展示这背后的想法


我希望这能有所帮助。

不幸的是,无法使用自定义函数将公式放入单元格中。我想这就是规格。那么,在您的情况下,直接使用Google Apps脚本而不使用自定义函数来输入公式如何?例如,脚本可以通过自定义菜单、OnEdit事件触发器等运行。我不确定你的整个剧本。所以我将此作为评论发布。如果这不是你想要的方向,我道歉。谢谢你的确认。是的,这几乎是我唯一的选择。唯一的问题是,我希望能够在工作表的任何地方使用不同的参数调用它。我的结论是,我必须为自定义函数使用图像公式,并在其他结构中使用图像。可能是一个类似仪表板的界面,带有列表的预定义位置,以便我可以附加或插入公式。我将把这个问题留给其他人,看看他们的想法和解决方案,这是一个非常好的例子。非常感谢,我想找到一个好的解决方案会对我有很大帮助。一个问题,我把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>
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);
}