我是一名编程新手,遇到问题并需要独特的解决方案时会转向不同的代码和应用程序。我是一名小学计算机老师,一直在寻找一种让学生从家里或从手机上传文件到我的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 Script的经验很少,因此我尝试了很多失败了的事情。这就像在黑暗中工作。
我最大的障碍是从
"teachers"
元素访问用户输入的选项值。关于此问题,我发现的大多数答案都包括创建条件语句,这是我尝试使用If (document.GetElementById('teachers').value == "teacher1") {function
...进行的第一件事。但是,我不断收到“未定义文档”错误,我知道这是因为我是在.gs文件而不是html文件中编写该脚本的。但是,我注意到可以通过form.myFirstName+form.myLastName
访问用户输入的文本。因此,我尝试使用form.teachers.value
代替document.GetElementById
方法。那也没有用。我已经花了数小时的时间(我会承认,在暑假学习新事物很有趣),但是我最终决定寻求帮助。我搜索了该网站和其他网站,以了解如何操作。我怀疑这是一个很简单的问题,无法解决,而且我也没有经验,甚至都没有注意到。
我还考虑过为每个单独的类创建不同的应用程序脚本,创建“老师的名字”文本输入,以及其他一些使这些文件井井有条的方法(如果无法弄清楚的话)。
在此先感谢您的帮助。
最佳答案
在服务器端.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中的表单对象不同。 Google服务器中的对象中没有“值”属性。即使element具有多个选项,也只有选择的选项是与name属性匹配并在对象中发送的值。
服务器上接收到的对象实际上不是HTML“表单”对象。这是一个已更改的对象。