【问题标题】:How to direct user-uploaded files to a specific Google Drive folder如何将用户上传的文件定向到特定的 Google Drive 文件夹
【发布时间】:2015-10-18 09:52:11
【问题描述】:

我是一名编程新手,当我遇到问题并需要独特的解决方案时,我会求助于不同的代码和应用程​​序。我是一名小学计算机教师,正在寻找一种方法让学生从家里或手机上传文件,然后上传到我的 Google Drive 帐户。我使用 Google Apps 脚本在 labnol.org1 上找到了解决方案。

我按照所有说明进行操作,一切正常。文件已成功上传到我的 Google Drive 帐户。我最终希望能够根据表单中用户输入的信息重命名文件。我在这个网站上找到了解决方案。我对 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,我希望将他的文件上传到我的 Drive 帐户中 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 方法。那也没用。

我为此花费了好几个小时(我承认,在暑假期间学习新事物很有趣),但我最终决定寻求一些帮助。我已经搜索了这个网站和其他网站来学习如何做到这一点。我怀疑这是一个很难解决的简单问题,而且我太缺乏经验甚至没有注意到。

我还考虑过为每个单独的课程创建不同的应用程序脚本,创建“教师姓名”文本输入,以及一些其他的东西来保持这些文件的井井有条,如果我无法弄清楚的话。

提前感谢您的帮助。

【问题讨论】:

    标签: javascript file-upload google-apps-script directory


    【解决方案1】:

    在服务器端.gs代码,试试:

    var whichTeacher = form.teachers;
    Logger.log("whichTeacher: " + whichTeacher);//VIEW, LOGS to see print out to log
    

    要查看 form 对象中的所有内容,您可以遍历对象内部的所有内容,并记录值,然后查看打印输出到日志:

    for (var key in form) {
      Logger.log('key is: ' + key);
      Logger.log('value is: ' + form[key]);
    };
    

    Apps 脚本在将表单对象发送到服务器之前对其进行修改。服务器接收到的对象的结构不像浏览器 HTML 中的表单对象。 Google 服务器中的对象中没有“值”属性。即使元素有多个选项,但只有选择的选项是匹配名称属性并在对象中发送的值。

    服务器接收到的对象并不是真正的 HTML“表单”对象。这是一个已更改的对象。

    【讨论】:

    • 非常感谢您对服务器端对象的解释。我从 .gs 脚本中删除了 .value 并继续使用条件语句!
    • 感谢您的反馈。
    【解决方案2】:

    阅读用户 Sandy Good 的回复后,我从条件语句中删除了.value。这是我成功的.gs 代码。

    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();
    }
    
    }
    

    这是一个非常简单的修复,一切都按预期工作。这是保持学生文件井井有条的好方法。

    【讨论】:

      猜你喜欢
      • 2023-01-16
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      相关资源
      最近更新 更多