Google apps script 在HTML中的successHandler函数中看不到来自服务器端函数的GAS数据
我有一个装订成册的应用程序脚本。我在日志中看到了我的服务器端代码(listCourses),找到了大量数据,最后一条语句是返回数据,但是客户端的JSON.stringify和SuccessHandler代码(afterServerRepl(e))看到null 以下代码来自Alan Wells的回答。我把它命名为“tinyTestHtml.html” 下面是创建边栏的函数,它是一个模板,并使用EVALUATEGoogle apps script 在HTML中的successHandler函数中看不到来自服务器端函数的GAS数据,google-apps-script,client-server,google-classroom,Google Apps Script,Client Server,Google Classroom,我有一个装订成册的应用程序脚本。我在日志中看到了我的服务器端代码(listCourses),找到了大量数据,最后一条语句是返回数据,但是客户端的JSON.stringify和SuccessHandler代码(afterServerRepl(e))看到null 以下代码来自Alan Wells的回答。我把它命名为“tinyTestHtml.html” 下面是创建边栏的函数,它是一个模板,并使用EVALUATE function showTinyTestHtml() { console.log(
function showTinyTestHtml() {
console.log('Begin showTinyTestHtml');
const ui = SpreadsheetApp.getUi();
/**
* Opens a sidebar to allow person to a single class
*/
let template = HtmlService
.createTemplateFromFile('tinyTestHtml');
let htmlOutput = template.evaluate()
.setTitle('Choose a Class')
.setWidth(400);
SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
.showSidebar(htmlOutput);
}
这是文件“cssStyle.html”
启用错误代码
function listCourses() {
console.log('Begin listCourses');
const optionalArgs = {
pageSize: 20
};
const response = Classroom.Courses.list(optionalArgs);
const courses = response.courses;
let unsrtCrsList = [], srtCrsList = [];
console.log('# courses: ', courses.length );
//code without sort
if ( courses &&
courses.length > 0 ) {
for ( i = 0 ; i < courses.length ; i++ ) {
let crsObj = courses[i];
if ( courses[i].courseState === 'ACTIVE' ) {
cName = courses[i].name;
cId = courses[i].id;
console.log('pushing name: ', cName );
srtCrsList.push([cName, cId]);
}
}
console.log(JSON.stringify(srtCrsList) );
return srtCrsList;
// code with sort
// if ( courses &&
// courses.length > 0 ) {
// for ( i = 0 ; i < courses.length ; i++ ) {
// let crsObj = courses[i];
// if ( courses[i].courseState === 'ACTIVE' ) {
// cName = courses[i].name;
// cId = courses[i].id;
// unsrtCrsList.push([cName, cId]);
// }
// }
// // sort by first value ascending
// srtCrsList = gasArraySort(unsrtCrsList, 0, -1 );
// console.log(JSON.stringify(srtCrsList) );
// console.log('End listCourses - # course: ', srtCrsList.length );
// return srtCrsList;
} else {
console.log(JSON.stringify(srtCrsList) );
console.log('End listCourses - no courses found.');
return srtCrsList;
}
}
/**
* https://developers.google.com/classroom/quickstart/apps-script
*/
function listCourses() {
console.log('Begin listCourses');
const optionalArgs = {
pageSize: 20
};
const response = Classroom.Courses.list(optionalArgs);
const courses = response.courses;
let unsrtCrsList = [], srtCrsList = [];
console.log('# courses: ', courses.length );
//code without sort
// if ( courses &&
// courses.length > 0 ) {
// for ( i = 0 ; i < courses.length ; i++ ) {
// let crsObj = courses[i];
// if ( courses[i].courseState === 'ACTIVE' ) {
// cName = courses[i].name;
// cId = courses[i].id;
// console.log('pushing name: ', cName );
// srtCrsList.push([cName, cId]);
// }
// }
// console.log(JSON.stringify(srtCrsList) );
// return srtCrsList;
// code with sort
if ( courses &&
courses.length > 0 ) {
for ( i = 0 ; i < courses.length ; i++ ) {
let crsObj = courses[i];
if ( courses[i].courseState === 'ACTIVE' ) {
cName = courses[i].name;
cId = courses[i].id;
unsrtCrsList.push([cName, cId]);
}
}
// sort by first value ascending
srtCrsList = gasArraySort(unsrtCrsList, 0, -1 );
console.log(JSON.stringify(srtCrsList) );
console.log('End listCourses - # course: ', srtCrsList.length );
return srtCrsList;
} else {
console.log(JSON.stringify(srtCrsList) );
console.log('End listCourses - no courses found.');
return srtCrsList;
}
}
-
-
-
-
-
- 完二〇〇五年三月二十五日更新
-
-
-
-
函数doGet(){
log('beginshowtinytesthtml');
/**
*打开一个侧栏,允许个人访问单个类
*/
让template=HtmlService
.createTemplateFromFile('tinyTestHtml');
让htmlOutput=template.evaluate()
.setTitle('选择一个类')
.设置宽度(400);
返回htmlOutput;
}
当我访问web应用程序URL时,我会阅读控制台,其中有JSON字符串,如下图所示:
更新:
如果我使用您的脚本“按原样”并从编辑器中运行函数showTinyTestHtml
,我也会得到预期的结果。
请参见请提供listcourses()命令的示例,以便我们生成错误。注意:这是要求OPs提供的基础,我认为这个命令
不起作用,我认为它需要evaluate()方法。但不可否认,我不太使用模板化的html,所以我可能错了。添加了listCourses模拟(删除不相关的细节)和显示html代码。如果您想要我可以提供的真正的listCourses,但JSON.stringify具有相同的结构[['name','id'],[…],请添加一个(缺少'cssStyle0'
文件)另外,在执行页面和web浏览器控制台中添加文本形式的任何错误消息。添加css和控制台窗口显示我接受这一回答,因为根据我共享的信息,这是真实的。随后,我发现在创建进入successHandler的数据时出错。我感到惊讶的是,数据没有以错误的形式进入,而是被认为是空的,但一旦格式正确,一切都很好,正如您所证明的。非常感谢你花这么多时间来帮助我。
<style>
/* comment */
h1 {
font-size: 20px;
}
h2 {
font-size: 18px;
font-weight: bold;
padding: 5px;
}
h3 {
font-size: 16px;
font-weight: bold;
padding: 3px;
} /*
.button {
font: 1em serif;
width: 50px;
}
button {
background: #ffffff;
border: 2px solid #333333;
border-radius: 5px;
cursor: pointer;
font: 1em serif;
font-size: 20;
margin-left: 40px;
width: 70px;
}
button:hover,
button:focus {
outline : none;
background : #000000;
color : #FFFFFF;
}
*/
#errMsg {
border: #ffffff;
color: red;
font-size: 14px;
}
form {
font-size: 14px;
margin: 0; /* Center the form on the page */
width: 450px;
}
form li + li {
margin-top: 3px;
}
input {
border: 1px solid #ffffff;
box-sizing: border-box;
font: 1em serif;
width: 250px;
}
.input {
border: 1px solid #ffffff;
box-sizing: border-box;
}
label {
display: inline-block;
font-weight: bold;
text-align: right;
width: 100px;
}
p {
margin: 3px auto;
padding: 3px;
}
.parent {
background : #eeeeee;
border: solid 2px;
padding: 10px;
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
</style>
/**
* https://developers.google.com/classroom/quickstart/apps-script
*/
function listCourses() {
console.log('Begin listCourses');
const optionalArgs = {
pageSize: 20
};
const response = Classroom.Courses.list(optionalArgs);
const courses = response.courses;
let unsrtCrsList = [];
if ( courses &&
courses.length > 0 ) {
for ( i = 0 ; i < courses.length ; i++ ) {
let crsObj = courses[i];
if ( courses[i].courseState === 'ACTIVE' ) {
cName = courses[i].name;
cId = courses[i].id;
unsrtCrsList.push([cName, cId]);
}
}
// sort by first value ascending
let srtCrsList = gasArraySort(unsrtCrsList, 0, -1 );
console.log(JSON.stringify(srtCrsList) );
console.log('End listCourses - # course: ', srtCrsList.length );
return srtCrsList;
} else {
console.log('End listCourses - no courses found.');
return;
}
}
/*
Begin listCourses
[["Essential Ed w Mattie","277964684794"],["LissaTestEnglish","256514192951"],["Lourdes AEL/ESL Class","250327591120"],["Lourdes Day Time ESL Multi-Level Class","171258050042"],["Lourdes's ESL Class","130831138700"],["Ms. Dee's Class","57299927845"],["2001-04-05T06:00:00.000Z","119335686849"]]
End listCourses - # course: 9
*/
/**
* https://sites.google.com/site/nnillixxsource/Notable/PivotChartsLib/ArrayLib
* sort ( data, columnIndex, ascOrDesc )
* veröffentlicht um 03.10.2013, 05:49 von nnil lixx
* [ aktualisiert: 07.12.2013, 17:55 ]
* ArrayLib.sort =
* I do not know how to hook up to this library
*/
function gasArraySort(data, columnIndex, ascOrDesc) {
if (data.length > 0) {
if (typeof columnIndex != "number" || columnIndex > data[0].length) {
throw "Choose a valide column index";
}
var r = new Array();
var areDates = true;
for (var i = 0; i < data.length; i++) {
if (data[i] != null) {
var date = new Date(data[i][columnIndex]);
if (isNaN(date.getYear()) && data[i][columnIndex] != "") {
areDates = false;
} else {
if (data[i][columnIndex] != "") {
data[i][columnIndex] = date;
}
}
r.push(data[i]);
}
}
return r.sort(function (a, b) {
if (ascOrDesc) {
return ((a[columnIndex] < b[columnIndex]) ? -1 : ((a[columnIndex] > b[columnIndex]) ? 1 : 0));
}
return ((a[columnIndex] > b[columnIndex]) ? -1 : ((a[columnIndex] < b[columnIndex]) ? 1 : 0));
});
} else {
return data;
function getFiles(e, rootFolderId, inMimeType) {
console.log('- - - - - - - - - Begin getFiles inMimeType: ', inMimeType );
console.log(JSON.stringify(e) );
var data = {};
var idn = e;
e = e == "root" ? DriveApp.getRootFolder().getId() : e;
data[e] = {};
data[e].keyname = DriveApp.getFolderById(e).getName();
data[e].keyparent = idn == rootFolderId
? null : DriveApp.getFolderById(e).getParents().hasNext()
? DriveApp.getFolderById(e).getParents().next().getId() : null;
data[e].files = [];
var da = idn == "root" ? DriveApp.getRootFolder() : DriveApp.getFolderById(e);
var folders = da.getFolders();
var files = da.getFiles();
while (folders.hasNext()) {
var folder = folders.next();
data[e].files.push({name: folder.getName(), id: folder.getId(), mimeType: "folder"});
}
// new code
var fileArr = [];
while (files.hasNext()) {
var file = files.next();
console.log('6 file.getMimeType(): ', file.getMimeType());
// data[e].files.push({name: file.getName(), id: file.getId(), mimeType: file.getMimeType()});
if ( file.getMimeType() === 'folder' ) {;
// do not save any files
} else if ( file.getMimeType() === inMimeType ) {
console.log('7 push fileArr name: ', file.getName() );
fileArr.push([file.getName(),file.getId(), file.getMimeType()]);
} else if ( inMimeType === 'EVERYTHING' ) {
console.log('8 push fileArr name: ', file.getName() );
fileArr.push([file.getName(),file.getId(), file.getMimeType()]);
}
}
console.log(' # files after files.hasNext: ', data[e].files.length );
let sorted = gasArraySort(fileArr, 0, true);
let numFiles = sorted.length;
console.log('# after sort: ;', numFiles );
for ( i = 0 ; i < numFiles ; i++ ) {
console.log('pushing sorted[i][0]: ', sorted[i][0] );
data[e].files.push({name: sorted[i][0], id: sorted[i][1], mimeType: sorted[i][2]});
}
// original code
// while (files.hasNext()) {
// var file = files.next();
// data[e].files.push({name: file.getName(), id: file.getId(), mimeType: file.getMimeType()});
// }
console.log(' # files after both while loops: ', data[e].files.length );
console.log('end getFiles - ', JSON.stringify(data) );
return data;
}
function listCourses() {
console.log('Begin listCourses');
const optionalArgs = {
pageSize: 20
};
const response = Classroom.Courses.list(optionalArgs);
const courses = response.courses;
let unsrtCrsList = [], srtCrsList = [];
console.log('# courses: ', courses.length );
//code without sort
if ( courses &&
courses.length > 0 ) {
for ( i = 0 ; i < courses.length ; i++ ) {
let crsObj = courses[i];
if ( courses[i].courseState === 'ACTIVE' ) {
cName = courses[i].name;
cId = courses[i].id;
console.log('pushing name: ', cName );
srtCrsList.push([cName, cId]);
}
}
console.log(JSON.stringify(srtCrsList) );
return srtCrsList;
// code with sort
// if ( courses &&
// courses.length > 0 ) {
// for ( i = 0 ; i < courses.length ; i++ ) {
// let crsObj = courses[i];
// if ( courses[i].courseState === 'ACTIVE' ) {
// cName = courses[i].name;
// cId = courses[i].id;
// unsrtCrsList.push([cName, cId]);
// }
// }
// // sort by first value ascending
// srtCrsList = gasArraySort(unsrtCrsList, 0, -1 );
// console.log(JSON.stringify(srtCrsList) );
// console.log('End listCourses - # course: ', srtCrsList.length );
// return srtCrsList;
} else {
console.log(JSON.stringify(srtCrsList) );
console.log('End listCourses - no courses found.');
return srtCrsList;
}
}
Mar 25, 2021, 3:47:08 PM Debug Begin listCourses
Mar 25, 2021, 3:47:08 PM Debug # courses: 9
Mar 25, 2021, 3:47:08 PM Debug pushing name: Essential Ed w Mattie
Mar 25, 2021, 3:47:08 PM Debug pushing name: LissaTestEnglish
Mar 25, 2021, 3:47:08 PM Debug pushing name: Ms. Dee's Class
Mar 25, 2021, 3:47:08 PM Debug pushing name: Lourdes AEL/ESL Class
Mar 25, 2021, 3:47:08 PM Debug pushing name: Lourdes Day Time ESL Multi-Level Class
Mar 25, 2021, 3:47:08 PM Debug pushing name: Lourdes's ESL Class
Mar 25, 2021, 3:47:08 PM Debug pushing name: English with Lissa Levels 4/5
Mar 25, 2021, 3:47:08 PM Debug [["Essential Ed w Mattie","277964684794"],["LissaTestEnglish","256514192951"],["Ms. Dee's Class","57299927845"],["Lourdes AEL/ESL Class","250327591120"],["Lourdes Day Time ESL Multi-Level Class","171258050042"],["Lourdes's ESL Class","130831138700"],["English with Lissa Levels 4/5","119335686849"]]
/**
* https://developers.google.com/classroom/quickstart/apps-script
*/
function listCourses() {
console.log('Begin listCourses');
const optionalArgs = {
pageSize: 20
};
const response = Classroom.Courses.list(optionalArgs);
const courses = response.courses;
let unsrtCrsList = [], srtCrsList = [];
console.log('# courses: ', courses.length );
//code without sort
// if ( courses &&
// courses.length > 0 ) {
// for ( i = 0 ; i < courses.length ; i++ ) {
// let crsObj = courses[i];
// if ( courses[i].courseState === 'ACTIVE' ) {
// cName = courses[i].name;
// cId = courses[i].id;
// console.log('pushing name: ', cName );
// srtCrsList.push([cName, cId]);
// }
// }
// console.log(JSON.stringify(srtCrsList) );
// return srtCrsList;
// code with sort
if ( courses &&
courses.length > 0 ) {
for ( i = 0 ; i < courses.length ; i++ ) {
let crsObj = courses[i];
if ( courses[i].courseState === 'ACTIVE' ) {
cName = courses[i].name;
cId = courses[i].id;
unsrtCrsList.push([cName, cId]);
}
}
// sort by first value ascending
srtCrsList = gasArraySort(unsrtCrsList, 0, -1 );
console.log(JSON.stringify(srtCrsList) );
console.log('End listCourses - # course: ', srtCrsList.length );
return srtCrsList;
} else {
console.log(JSON.stringify(srtCrsList) );
console.log('End listCourses - no courses found.');
return srtCrsList;
}
}
Mar 25, 2021, 3:42:32 PM Debug Begin listCourses
Mar 25, 2021, 3:42:32 PM Debug # courses: 9
Mar 25, 2021, 3:42:32 PM Debug [["Essential Ed w Mattie","277964684794"],["LissaTestEnglish","256514192951"],["Lourdes AEL/ESL Class","250327591120"],["Lourdes Day Time ESL Multi-Level Class","171258050042"],["Lourdes's ESL Class","130831138700"],["Ms. Dee's Class","57299927845"],["2001-04-05T06:00:00.000Z","119335686849"]]
Mar 25, 2021, 3:42:32 PM Debug End listCourses - # course: 7