我正在上课,在课堂上我将所有学生的成绩保存在Google电子表格中。在我的网站上,我想以个人身份向学生提供信息。我创建了一个应用程序,在其中显示密码文本框。他们输入密码,然后从电子表格中检索对他们来说唯一的信息,并在标签中将它们呈现给他们。我一直试图将这一切都整合在一起,但是它没有正常工作,而且我得到了一个我无法诊断的错误。如果我使用Browser.msgBox()打印出信息,它会输出信息,但否则会产生错误。为什么会发生这种情况?解决方法是什么?这是代码:
var pointsSheet = SpreadsheetApp.openById('1o8_f063j1jYZjFEnI_P7uAztpnEAvQ6mc3Z1_Owa69Y');
//creates and shows an app with a label and password text box
function doGet() {
var app = UiApp.createApplication().setTitle('Incomplete Challenges');
var mygrid = app.createGrid(1, 2);
mygrid.setWidget(0, 0, app.createLabel('Password:'));
mygrid.setWidget(0, 1, app.createPasswordTextBox().setName("text"));
var mybutton = app.createButton('Submit');
var submitHandler = app.createServerClickHandler('getResults');
submitHandler.addCallbackElement(mygrid);
mybutton.addClickHandler(submitHandler);
var mypanel = app.createVerticalPanel();
mypanel.add(mygrid);
mypanel.add(mybutton);
app.add(mypanel);
SpreadsheetApp.getActiveSpreadsheet().show(app);
//return app; //UNCOMMENT WHEN DEPLOYING APP
}
//obtains data based on password entered by user and outputs their info
function getResults(eventInfo) {
var app = UiApp.createApplication().setTitle('Incomplete Challenges');
var password = eventInfo.parameter.text;
var passwordCheckRange = pointsSheet.getRange("B34:C34").getValues();
if (passwordCheckRange == null) {
Browser.msgBox("Error: Range is null");
return app;
}
var name;
for(var i = 0; i < passwordCheckRange.length; i++) {
if(passwordCheckRange[i][1] == password) {
name = passwordCheckRange[i][0];
break;
}
}
var studentRecordRange = pointsSheet.getRange("B3:AY29").getValues();
var headingRange = pointsSheet.getRange("B1:AY2").getValues();
if (studentRecordRange == null) {
Browser.msgBox("Error: Range is null");
return app;
}
var requestedRecord;
for(var i = 0; i < studentRecordRange.length; i++) {
if(studentRecordRange[i][0] == name)
requestedRecord = studentRecordRange[i];
}
var stringRecord = "";
for(var i = headingRange[1].length-1; i >= 7; i--) {
if (requestedRecord[i] == "")
stringRecord += headingRange[1][i] + ": " + headingRange[0][i] + "XP" + "\\n";
}
var mygrid = app.createGrid(2, 1);
mygrid.setWidget(0, 0, app.createLabel('INCOMPLETE CHALLENGES'));
mygrid.setWidget(1, 0, app.createLabel(stringRecord));
var mypanel = app.createVerticalPanel();
mypanel.add(mygrid);
app.add(mypanel);
//Browser.msgBox(stringRecord);
return app;
}
我遇到的错误是:遇到错误:发生了意外错误。
你可以看到它非常有用。
答案 0 :(得分:2)
第28行应该是 getActiveApplication ()而不是 createApplication() 。 您无法在其他应用程序上创建应用程序。 :)
另外我认为第63行应该是"<br>";
而不是#34; \ n&#34 ;;与第68行一样,它应该是 createHTML 而不是 createLabel
我还认为你已经应用了几个样式css,以便你的应用程序看起来很好。检查UiApp中的.setStyleAttributes。
答案 1 :(得分:1)
此代码中存在一些错误,第一个产生错误的错误是(在另一个答案中提到)处理函数中的UiApp.createApplication()
。
您无法在处理函数中创建UiApp实例,您应该获取活动实例并最终向其添加元素(使用UiApp.getActiveApplication()
)。
您既不能更改此实例的标题。顺便说一句,它没有意义,因为当你将这个应用程序部署为webapp时,这个标题不会显示为“标题”。它只会显示在浏览器窗口的顶部(作为页面标题),因为您的应用程序将占据整个屏幕,而不再是模式弹出窗口。因此,如果您希望在Ui中显示标题,只需将其添加为HTML小部件,您可以在其中选择字体大小和重量(以及任何其他CSS样式)。
另一个错误是在密码检查中,您正在使用Browser.msgBox("Error: Range is null");
但是浏览器类在UiApp中不起作用。您应该只使用UiApp元素,而不是spreadSheetApp元素。
而且,作为更一般的评论,我建议您使用应用的.dev网址(上次保存的版本)直接测试您的应用(在保存测试版并部署之后),以便您处于“真实状态” “使用条件并对结果有相关的pov。