【问题标题】:Importing Google Apps Script form submission into existing Spreadsheet将 Google Apps 脚本表单提交导入现有电子表格
【发布时间】:2016-09-19 21:40:57
【问题描述】:

我有一个 Google 云端硬盘,里面有一个名为“提交”的文件夹。 我还有一个 Google Apps 脚本,它既可以创建“表单”,也可以将最终用户(从表单)上传的内容存入提交文件夹。

这是一个脚本示例(server.gs):

 function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('form.html');
}

function uploadFiles(form) {

  try {

    var dropbox = "Submissions";
    var folder, folders = DriveApp.getFoldersByName(dropbox);

    if (folders.hasNext()) {
      folder = folders.next();
    } else {
      folder = DriveApp.createFolder(submissions);
    }

    var blob = form.myFile;    
    var file = folder.createFile(blob);    
    file.setDescription("Uploaded by " + form.myName);

    return "File uploaded successfully " + file.getUrl();

  } catch (error) {

    return error.toString();
  }

}

而Form.html如下:

<form id="myForm">

<label>Name:</label>
<input type="text" name="myName">

<label>Email:</label>
<input type="text" name="myEmail">

<label>Demo Title (e.g "Artist - Demo Name"):</label>
<input type="text" name="myTitle">

<label>Choose Demo File:</label>
<input type="file" name="myFile">

<input type="submit" value="Submit" 
           onclick="google.script.run
                    .uploadFiles(this.parentNode);
                    return false;">

这样做是创建一个具有“名称”、“电子邮件”、“演示标题”文本字段以及“提交”按钮的表单。用户附加文件并使用此表单上传文件。

现在文件上传工作正常。任何人都可以上传文件,它会正确显示在我的谷歌驱动器上的文件夹(提交)中......但是,其他细节就像从未输入过一样消失了。我希望这些详细信息出现在现有的电子表格中,最好带有时间戳。

谁能帮帮我?

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    你必须使用Class SpreadsheetApp,通过这个课程你将能够使用SpreadsheetApp.getActiveSpreadsheet()getSheetByName()getRange()getLastRow()getLastColumn()等等。

    这是来自 tutorial 的示例代码:

    var doc = SpreadsheetApp.openById(ID);
    var sheet = doc.getSheetByName(SHEET_NAME);
    // we'll assume header is in row 1 but you can override with header_row in GET/POST data
    var headRow = e.parameter.header_row || 1;
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var nextRow = sheet.getLastRow()+1; // get next row
    var row = [];
    // loop through the header columns
    for (i in headers){
    if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column
    row.push(new Date());
    } else { // else use header name to get data
    row.push(e.parameter[headers[i]]);
    }
    }
    // more efficient to set values as [][] array than individually
    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
    // return json success results
    return ContentService
    .createTextOutput(JSON.stringify({"result":"success", "row": nextRow}))
    .setMimeType(ContentService.MimeType.JSON);
    } catch(e){
    // if error return this
    return ContentService
    .createTextOutput(JSON.stringify({"result":"error", "error": e}))
    .setMimeType(ContentService.MimeType.JSON);
    } finally { //release lock
    lock.releaseLock();
    }
    

    编辑:

    例如这是你的代码

     <form id="myForm">
    
    <label>Name:</label>
    <input type="text" name="myName">
    
    <label>Email:</label>
    <input type="text" name="myEmail">
    
    <label>Demo Title (e.g "Artist - Demo Name"):</label>
    <input type="text" name="myTitle">
    
    <label>Choose Demo File:</label>
    <input type="file" name="myFile">
    
    <input type="submit" value="Submit" 
               onclick="google.script.run
                        .uploadFiles(this.parentNode);
                        return false;">
    

    (服务器.gs)

    function doGet(e) {
      return HtmlService.createHtmlOutputFromFile('form.html');
    }
    
    function uploadFiles(form) {
    
      try {
    
        var dropbox = "Submissions";
        var folder, folders = DriveApp.getFoldersByName(dropbox);
    
        if (folders.hasNext()) {
          folder = folders.next();
        } else {
          folder = DriveApp.createFolder(submissions);
        }
    
        var blob = form.myFile;    
        var file = folder.createFile(blob);    
        file.setDescription("Uploaded by " + form.myName);
    
        return "File uploaded successfully " + file.getUrl();
    
        //pass data to spreadsheet
        processForm(YOUR_VARIABLES)
    
      } catch (error) {
    
        return error.toString();
      }
    
    }
    function processForm(YOUR_VARIABLES) {
    
      var Name = name;
      var email = email;
    
    
      var ss = SpreadsheetApp.openById(SPEADSHEET_ID); 
      var sheet = ss.getSheetByName(SHEET_NAME);
    
      //Change this depending on the order and number of inputs to be recorded
      sheet.getRange(sheet.getLastRow()+1, 1, 1, 5).setValues([[Name,email]]);  
    }
    

    您还可以查看此答案以获得有关如何实施电子表格应用程序的一些想法:Get form input text value to insert in a Google SpreadsheetUploading file using Google Apps Script using HtmlService

    【讨论】:

    • 感谢您的回复。我应该提到我的编码技能基本上是初学者水平,所以我对你的回答所做的有点令人困惑。我是将这个新代码放在“server.gs”脚本还是“form.html”部分?看起来好像我需要更改您的代码,但究竟如何超出我的能力:(
    • 整个代码不用改,加入integrateSpreadSheetApp()类即可。只是为了跟进,您想将数据保存到电子表格而不是直接保存在驱动器中吗?
    • 我希望表单的上传部分完全按照原样进行(音频文件进入文件夹),但是我希望输入的其他详细信息(姓名、电子邮件等)进入现有电子表格,为每行添加一个时间戳(每次提交)。我认为这并不像在我的代码中添加“SpreadSheetApp()”那么简单
    • 因此,当最终用户填写表单时,他们有 6 个输入字段:姓名、电子邮件、演示标题、“上传字段”、备注、“提交按钮”。当他们填写所有信息时,只有“上传字段”有效。为了进一步描述这一点,所有其他信息(姓名、电子邮件、演示标题和注释)都消失了,因为它们无处可去。我需要按照上述更改我现有的代码,以使其他信息能够进入现有的谷歌表格。
    • 更改为您的代码添加功能,对吧?我编辑了我的答案,希望对您有所帮助并为您解决问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2012-09-07
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多