google-apps-script - 在 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 的方法。那些不适用于表内自定义功能。
任何机构有一个想法?将不胜感激。
解决方案
正如 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
来显示图像了。
请记住,这是一个非常简化的示例,可以通过多种方式进行扩展和改进。它的目的只是为了展示这背后的想法。
我希望这有任何帮助。
推荐阅读
- reactjs - 当使用 ReactJS 和 JSX 时,我们可以编写以某种方式返回某些元素的普通 JS 代码吗?
- java - 使用 Java 验证电话号码
- javascript - 计数除空值外的数组
- r - R:如何替换数据框中的一组值
- google-apps-script - 在每张表格中按单元格值隐藏单个 Google 表格
- mongodb - 在 mongo 3.6.22 中查询错误,在 4.4.3 企业版中运行良好
- mongodb - 合并对象字段聚合
- javascript - 无法修复 ERR_FILE_NOT_FOUND
- angular - 如何仅从下面的函数中提取 id 值?由于我是角度和打字稿的初学者,我无法弄清楚
- php - calDAV“PROPFIND”调用来自 calendar.yahoo.com 服务器的“401 Unauthorized”响应