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);
}