2013-05-30 15 views
0

我需要在Google Script中创建一个可以从电子表格中读取值并根据第一列的值将这些值加载到文本区域的应用程序。例如,在第一列中,第二个名字中的NickNames,第三个姓中的第四个停止日期中有NickNames。我设法使用getRange将昵称加载到列表框中。但我需要知道如何根据NickName将相邻值(第一个,最后一个,停止日期)加载到文本区域中。点击按钮后,这些值将被更新而不创建新的记录。让我知道。这将有很大的帮助。如何根据电子表格中第一列的值 - Google脚本将值加载到多个文本区域?

这是我到目前为止的代码。我需要根据从下拉框中选择的昵称值加载到相应的文本字段:

function doGet() { 
var app = UiApp.createApplication(); 
var abspanel= app.createAbsolutePanel(); 
var stackpanel=app.createStackPanel(); 
var grid3=app.createGrid(12,12).setId('grd3'); 
var loadbtn= app.createButton('Load Employee Data'); 
var selectlbl=app.createLabel('Select Employee'); 
var active= SpreadsheetApp.openById('0Ai21cbl').getSheetByName('testing'); 
var endrow= active.getLastRow()-1; 
var emplist=app.createListBox().setId('emps').setName('elist'); 

var emprange= active.getRange('A2:F100').getValues().sort(); 
for(var i=0; i<emprange.length; i++){ 
    emplist.addItem(emprange[i][0]) 
} 

var efirstlabel=app.createLabel('First').setId('elabel'); 
var efname=app.createTextArea().setId('efirst').setHeight('20px').setName('efst'); 
var elastlabel=app.createLabel('Last').setId('ellabel'); 
var elname=app.createTextArea().setId('elast').setHeight('20px').setName('elst'); 
var enicklabel=app.createLabel('NickName').setId('enlabel'); 
var enname= app.createTextArea().setId('enick').setHeight('20px').setName('enk'); 
var eattlabel= app.createLabel('Employee Attribute').setId('ealabel').setHeight('20px'); 
var eatt1='TLYDYE' 
var eatt2='TLYDNE' 
var eatt3='TLNDYE' 
var eatt4='TLNDNE' 
var eatt5='CAYDYE' 
var eatt6='CAYDNE' 
var eatt7='CANDYE' 
var eatt8='CANDNE' 
var eattlist=app.createListBox().setWidth('120px').setId('eattribute').setName('eattbt') 
eattlist.addItem(eatt1); 
eattlist.addItem(eatt2); 
eattlist.addItem(eatt3); 
eattlist.addItem(eatt4); 
eattlist.addItem(eatt5); 
eattlist.addItem(eatt6); 
eattlist.addItem(eatt7); 
eattlist.addItem(eatt8); 

var estartlabel=app.createLabel('Start Date:'); 
var estartdate=app.createDateBox().setId('edate'); 
var estoplabel=app.createLabel('Stop Date:'); 
var estopdate=app.createDateBox().setId('sdate'); 
var inlabel=app.createLabel().setId('indexlabel'); 

//Edit Employee Handler 

var loadhandler=app.createServerClickHandler('loadEmp'); 
loadhandler.addCallbackElement(stackpanel); 
loadbtn.addClickHandler(loadhandler); 

grid3 
.setWidget(1,1,selectlbl) 
.setWidget(1,2,emplist) 
.setWidget(1,3,loadbtn) 
.setWidget(2,1, efirstlabel) 
.setWidget(2,2, efname) 
.setWidget(2,3, elastlabel) 
.setWidget(2,4, elname) 
.setWidget(3,1, enicklabel) 
.setWidget(3,2, enname) 
.setWidget(4,1, eattlabel) 
.setWidget(5,1,eattlist) 
.setWidget(6,1,estartlabel) 
.setWidget(7,1,estartdate) 
.setWidget(8,1,estoplabel) 
.setWidget(9,1,estopdate) 
.setWidget(10,1,inlabel); 

stackpanel.add(grid3, 'Edit Employee').setStyleAttribute("text-align", "center") 
app.add(abspanel) 
app.add(stackpanel) 
return app; 
} 

function loadEmp(e){ 
var app=UiApp.getActiveApplication(); 

app.getElementById('efirst').setValue(e.parameter.elist); 

return app; 
} 
+0

你是在问一个人为你开发吗?这不是正确的地方。如果没有,那么请添加一些你的尝试代码和你遇到问题的地方。 –

+0

Henrique我添加了上面的代码。我基本上想要在单击按钮之后,将所选昵称中的相邻值加载到文本区域中。然后用另一个按钮就可以在电子表格 – Manuel303

回答

0

嗯,我想这是更容易,如果将每个名称到列表中,当你添加为返回行的值数字而不是省略,只有名字。这样,它会更容易(即你不需要搜索它)重新加载处理器上的值。例如

function doGet() { 
    //... the starting code your already have 
    var emprange = active.getDataRange().getValues(); //sorting a matrix doesn't make sense 
    //also, it's easier if you sort by the desired column the on the spreadsheet before hand 
    for(var i = 1; i < emprange.length; ++i) 
    emplist.addItem(emprange[i][0], i); //this 2nd parameter "i" is the return value 

    //... rest of your code 
} 

function loadEmp(e) { 
    var app = UiApp.getActiveApplication(); 
    var active = SpreadsheetApp.openById('0Ai21cbl').getSheetByName('testing'); 
    var index = +e.parameter.elist; 
    var empdata = active.getRange(index+1, 1, 1, 6).getValues()[0]; 
    var cols = ['efirst','elast','enick']; //in the same order as in the spreadsheet 
    for(var i = 0; i < cols.length; ++i) 
    app.getElementById(cols[i]).setValue(empdata[i]); 
    return app; 
} 

这与保存按钮是一样的,你只需要setValues而不是get。

+0

Henrique中更新这些数据。它读取值,但将它们全部放入一个文本框中。它不分割值。一切都在一个由逗号分隔的文本框中。在其他文本框中,我得到未定义的值。任何想法? – Manuel303

+0

它已修复。忘了添加行的括号,因为'getValues'总是返回一个矩阵。 –

+0

现在有效。但是,你知道为什么datebox没有用正确的值更新吗?我向elist添加了一个更改处理程序。名字姓氏中的值更改。但是开始日期和结束日期仅在有些时候有效。我在列表框中更改员工姓名,有时日期不更新以反映单元格值。这是否与价值类型有关?也许与索引中的e.parameter? – Manuel303

相关问题