我是编程新手,当我遇到问题并需要一个独特的解决方案时,转向不同的代码和应用程序。我是一名小学计算机老师,正在寻找一种方法让学生从家里或手机上传文件,然后上传到我的Google云端硬盘帐户。我使用Google Apps脚本在labnol.org 1上找到了解决方案。
我遵循了所有指示,一切都很顺利。这些文件已成功上传到我的Google云端硬盘帐户。我最终希望能够根据表单中的用户输入信息重命名文件。我在这个网站上找到了解决方案。我对html和gs文件进行了一些更改......
HTML:
<form id="myForm">
<input type="text" name="myFirstName" placeholder="First Name">
<input type="text" name="myLastName" placeholder="Last Name">
<input type="file" name="myFile">
<input type="submit" value="Upload File"
onclick="this.value='Uploading...';
google.script.run.withSuccessHandler(fileUploaded)
.uploadFiles(this.parentNode);
return false;"
>
</form>
<script>
function fileUploaded(status) {
document.getElementById('myForm').style.display = 'none';
document.getElementById('output').innerHTML = status;
}
</script>
Google Apps脚本
function doGet(e) {
return HtmlService.createHtmlOutputFromFile('form.html');
}
function uploadFiles(form) {
try {
var dropbox = "Sample Form 3rd Grade";
var folder, folders = DriveApp.getFoldersByName(dropbox);
if (folders.hasNext()) {
folder = folders.next();
} else {
folder = DriveApp.createFolder(dropbox);
}
var blob = form.myFile;
var fileBlob = form.myFile;
var fname = fileBlob.getName();
var newName = form.myLastName+form.myFirstName; // simple example
// extract extension using RegEx
// from http://stackoverflow.com/a/680982/1677912
var extensionfinder = /(?:\.([^.]+))?$/;
var ext = extensionfinder(fname)[1];
fileBlob.setName(newName+'.'+ext);
var file = folder.createFile(blob);
file.setDescription("Uploaded by " + form.myFirstName+form.myLastName);
return "<p> Thanks for uploading a photo for the technology project, " + form.myFirstName + "!";
} catch (error) {
return error.toString();
}
}
同样,一切都很好。但是,我希望接下来要做的是让学生从下拉列表中选择他们的老师的名字,并根据他们的回答,将学生的文件上传到不同的文件夹。例如,如果Student1选择Teacher1,我希望将他的文件上传到我的云端硬盘帐户中的Teacher1指定文件夹中。这纯粹是为了让事情井井有条,节省时间。
新的html如下:
<form id="myForm">
<font face="sans-serif">Select your teacher:</font>
<select id="teachers" name="teachers">
<option value="teacher1">Teacher1</option>
<option value="teacher2">Teacher2</option>
<option value="teacher3">Teacher3</option>
<option value="teacher4">Teacher4</option>
</select>
<input type="text" name="myFirstName" placeholder="First Name">
<input type="text" name="myLastName" placeholder="Last Name">
<input type="file" name="myFile">
<input type="submit" value="Upload File"
onclick="this.value='Uploading...';
google.script.run.withSuccessHandler(fileUploaded)
.uploadFiles(this.parentNode);
return false;"
>
</form>
<script>
function fileUploaded(status) {
document.getElementById('myForm').style.display = 'none';
document.getElementById('output').innerHTML = status;
}
</script>
我在使用Java和Google Apps脚本方面经验很少,所以我尝试过许多失败的事情。这就像在黑暗中工作。
我最大的障碍是从"teachers"
元素访问用户输入的选项值。我在这个问题上找到的大多数答案都包括创建一个条件语句,这是我尝试使用If (document.GetElementById('teachers').value == "teacher1") {function
的第一件事......等等。但是,我一直得到“文档未定义”错误,我学到的是因为我在.gs文件中编写该脚本,而不是html文件。嘿,我注意到用户输入的文字可以通过form.myFirstName+form.myLastName
访问。所以我尝试form.teachers.value
代替document.GetElementById
方法。这也行不通。
我花了好几个小时的时间(我承认,在暑假期间学习新事物很有趣),但我最终决定寻求一些帮助。我搜索了这个网站和其他人,以了解如何做到这一点。我怀疑这是一个很难解决的问题,而且我太缺乏经验,甚至没有注意到。
我还考虑过为每个单独的类创建不同的应用程序脚本,创建一个“教师姓名”文本输入,以及一些其他的东西来保持这些文件的组织,如果我不能解决这个问题。
提前感谢您的帮助。
答案 0 :(得分:1)
在服务器端.gs
代码中,尝试:
var whichTeacher = form.teachers;
Logger.log("whichTeacher: " + whichTeacher);//VIEW, LOGS to see print out to log
要查看form
对象中的所有内容,您可以遍历对象内的所有内容,并记录值,然后查看打印到LOG:
for (var key in form) {
Logger.log('key is: ' + key);
Logger.log('value is: ' + form[key]);
};
Apps脚本在将表单对象发送到服务器之前修改它。服务器接收的对象的结构不像浏览器HTML中的表单对象。没有&#34;价值&#34; Google服务器中对象的属性。尽管element有多个选项,但只有选择的选项是与name属性匹配并在对象中发送的值。
在服务器上接收的对象实际上不是HTML&#34;形式&#34;宾语。它是一个已经改变的对象。
答案 1 :(得分:1)
After reading user Sandy Good's reply, I removed .value
from my conditional statement. Here is my successful .gs
code.
function doGet(e) {
return HtmlService.createHtmlOutputFromFile('form.html');
}
function uploadFiles(form) {
try {
if(form.teachers == "teacher1") {
var dropbox = "Teacher1's Class";
}
else if(form.teachers == "teacher2") {
var dropbox = "Teacher2's Class";
}
else if(form.teachers == "teacher3") {
var dropbox = "Teacher3's Class";
}
else if(form.teachers == "teacher4") {
var dropbox = "Teacher4's Class";
}
var folder, folders = DriveApp.getFoldersByName(dropbox);
if (folders.hasNext()) {
folder = folders.next();
} else {
folder = DriveApp.createFolder(dropbox);
}
var blob = form.myFile;
var fileBlob = form.myFile;
var fname = fileBlob.getName();
var newName = form.myLastName+form.myFirstName; // simple example
// extract extension using RegEx
// from http://stackoverflow.com/a/680982/1677912
var extensionfinder = /(?:\.([^.]+))?$/;
var ext = extensionfinder(fname)[1];
fileBlob.setName(newName+'.'+ext);
var file = folder.createFile(blob);
file.setDescription("Uploaded by " + form.myFirstName+form.myLastName);
return "<p> Thanks for uploading a photo for the technology project, " + form.myFirstName + "!";
}
catch (error) {
return error.toString();
}
}
It was a very simple fix, and everything works as expected. This is a great way to keep my student's files organized.