我正在尝试为文本框编写通用服务器处理程序,在文本框获得焦点时突出显示文本:
function onFocusHighlight(e) {
var app = UiApp.getActiveApplication();
var widget = app.getElementById(e.parameter.source);
var widgetValue = e.parameter.widgetName; // how can I get widgetName from source???
widget.setSelectionRange(0, widgetValue.length);
return app;
}
我可以从e.parameter.source确定widgetValue吗?
答案 0 :(得分:0)
var widget = app.getElementById(e.parameter.source).setName("widgetName")
然后获取widgetValue:
var widgetValue = e.parameter.widgetName
检查https://developers.google.com/apps-script/uiapp是否使用了setName
。
答案 1 :(得分:0)
我发现只要widgetName
和widgetId
相同,我就可以确定widgetValue
如下:
function onFocusHighlight(e) {
var app = UiApp.getActiveApplication();
var widgetId = e.parameter.source;
var widgetName = widgetId; // name MUST match id to retrieve widget value
var widgetValue = e.parameter[widgetName]; // not sure why this syntax works???
var widget = app.getElementById(widgetId);
widget.setSelectionRange(0,widgetValue.length);
return app;
}
我现在唯一的问题是了解e.parameter[widgetName]
语法实际如何/为何如此有效。如果有一个解决方案不依赖于widgetName
和widgetId
是相同的值,那也很棒。
答案 2 :(得分:0)
只是一个建议,按照你自己的回答:
您可以通过在某处获取转换表来使其工作,该转换表从其ID获取小部件名称。
例如,您可以定义:
ScriptProperties.setProperties({'widgetID1':'Name1','widgetID2':'name2'},true)
然后
widgetvalue = e.parameter[ScriptProperties.getProperty(e.parameter.source)]
我没有测试这段代码,但似乎合乎逻辑;-),告诉我它是否没有(我现在没时间测试)
编辑按预期工作,这里有一个test sheet来显示结果,测试代码如下。
function Test(){
var app = UiApp.createApplication().setTitle('test');
app.add(app.createLabel('Type anything in upper textBox and then move your mouse over it...'))
var p = app.createVerticalPanel()
var txt1 = app.createTextBox().setId('txt1').setName('Name1').setValue('value in TextBox1')
var txt2 = app.createTextBox().setId('txt2').setName('Name2').setValue('waiting to mouseOver textBox1')
p.add(txt1).add(txt2)
app.add(p)
var handler = app.createServerHandler('mouseOver').addCallbackElement(p);
txt1.addMouseOverHandler(handler);
ScriptProperties.setProperties({'txt1':'Name1','txt2':'Name2'},true);//save the name, only txt1 will be used here
var ss=SpreadsheetApp.getActiveSpreadsheet()
ss.show(app)
}
function mouseOver(e) {
var app = UiApp.getActiveApplication();
var widget = app.getElementById(e.parameter.source);
var widgetValue = e.parameter[ScriptProperties.getProperty(e.parameter.source)]; // ScriptProperties knows the Widget's name
app.getElementById('txt2').setValue(widgetValue) ;// Use the other widget to show result
return app;
}