英文:
Return CellImage from Custom Function in Apps Script
问题
我正在尝试从Google Sheets自定义函数中返回一个CellImage。我在Apps Script中构建了图像:
function TESTIMG() {
let oneImage = SpreadsheetApp
.newCellImage()
.setSourceUrl('https://bluewarelabs.files.wordpress.com/2022/10/cropped-bwl-logo-4.png')
.build();
return oneImage;
}
该函数没有出现错误,但它生成了一个空白单元格。然而,如果只是使用以下方式生成图像:
=IMAGE("https://bluewarelabs.files.wordpress.com/2022/10/cropped-bwl-logo-4.png")
那么它可以正常工作。
这是否是一个已知的错误?返回CellImage不起作用吗?
英文:
I'm trying to return a CellImage from a Google Sheets custom function. I build out the image in Apps Script:
function TESTIMG() {
let oneImage = SpreadsheetApp
.newCellImage()
.setSourceUrl('https://bluewarelabs.files.wordpress.com/2022/10/cropped-bwl-logo-4.png')
.build();
return oneImage;
}
The function does not error out, but it produces blank cell. However, if just generate the image using
=IMAGE("https://bluewarelabs.files.wordpress.com/2022/10/cropped-bwl-logo-4.png")
It works fine.
Is this a known bug? Returning a CellImage not working?
答案1
得分: 1
如上面的评论中提到的,要将CellImageBuilder
类的对象放入单元格作为图像对象,需要使用setValue
或setValues
进行设置。您可以在此处提交一个功能建议:点击此处。
我猜想还有其他方法可以实现您的目标,但为了给您一个想法,我想到了以下的解决方法:
function insertImage()
{
let images = [
'https://bluewarelabs.files.wordpress.com/2022/10/cropped-bwl-logo-4.png',
'https://developers.google.com/google-ads/scripts/images/reports.png',
'https://i.imgur.com/gtfe7oc.png',
'https://www.google.com/images/srpr/logo3w.png'
]
let column = SpreadsheetApp.getActiveRange().getColumn();
let row = SpreadsheetApp.getActiveRange().getRow();
for (let i=0; i<images.length; i++){
//使用此选项插入IMAGE公式
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(row, column+i).setFormula('=IMAGE("' + images[i] + '")');
//如果您想要使用newCellImage方法进行操作,可以使用此选项
// let oneImage = SpreadsheetApp.newCellImage().setSourceUrl(images[i]).build().toBuilder();
// SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(row, column+i).setValue(oneImage);
}
}
由于Google Sheets中自定义函数存在一些限制,此解决方法不能用作自定义函数。相反,您可以在菜单中添加一个选项,然后从菜单中运行该函数,以避免手动运行脚本。要在Google Sheets菜单中添加选项,您可以在脚本中添加以下内容:
function onOpen( ){
// 这一行调用了SpreadsheetApp并获取其UI
var ui = SpreadsheetApp.getUi();
// 这些行创建了菜单项并将它们与我们将在Apps Script中编写的函数绑定起来
ui.createMenu('Custom Functions')
.addItem('Instert Images', 'insertImage')
.addSeparator()
.addToUi();
}
运行onOpen()
函数,然后返回您的Google表格,您将在菜单中看到新的选项:
参考链接:
英文:
As mentioned in the comments above, in order to put the Class CellImageBuilder
object into a cell as the image object, it is required to put it using setValue
or setValues
. You can submit a feature idea here.
I guess there are other ways to achieve your goal but to give you an idea, I thought of the following workaround:
function insertImage()
{
let images = [
'https://bluewarelabs.files.wordpress.com/2022/10/cropped-bwl-logo-4.png',
'https://developers.google.com/google-ads/scripts/images/reports.png',
'https://i.imgur.com/gtfe7oc.png',
'https://www.google.com/images/srpr/logo3w.png'
]
let column = SpreadsheetApp.getActiveRange().getColumn();
let row = SpreadsheetApp.getActiveRange().getRow();
for (let i=0; i<images.length; i++){
//Use this option to insert the IMAGE formula
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(row, column+i).setFormula('=IMAGE("'+ images[i] +'")');
//You can use this option if you want to do it with the newCellImage method
// let oneImage = SpreadsheetApp.newCellImage().setSourceUrl(images[i]).build().toBuilder();
// SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(row, column+i).setValue(oneImage);
}
}
Due to some limitations with custom functions in Google Sheets, this workaround can't be used as a custom function. Instead you can add an option in the menu and run the function from there so you don't have to run the script manually. To add the option in the Google Sheets menu, you can add the following in your script:
function onOpen( ){
// This line calls the SpreadsheetApp and gets its UI
// Or DocumentApp or FormApp.
var ui = SpreadsheetApp.getUi();
//These lines create the menu items and
// tie them to functions we will write in Apps Script
ui.createMenu('Custom Functions')
.addItem('Instert Images', 'insertImage')
.addSeparator()
.addToUi();
}
Run the onOpen()
function and go back to your Google Sheet and you will see the new option in the menu:
References:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论