2017-04-17 24 views
0

我已经通过将我找到的一些代码拼接在一起制作了一个小型的Web应用程序窗体。它对我来说几乎完美,可让我将文件上传到Google云端硬盘文件夹,将表单中提交的数据记录在电子表格中,并在文件上传时通过电子邮件发送给我。如何重命名上传到应用脚本网络应用表单的文件?

但是,我真正想要做的是根据表单数据重命名上传的文件。例如,如果输入的制造商值=“Sony”并且日期值= 12-04-2016,则使文件名“Sony_12-04-2016.pdf”

从查看它似乎最好我可以我需要提交的值传递到的CreateFile()函数,但我很新的编码和真的不知道我在做什么在这里..

这是我到目前为止有:

。 gs

var TO_ADDRESS = "my email address"; 

function doGet(e) { 
    return HtmlService.createTemplateFromFile('index') 
    .evaluate() 
    .setTitle('Price List Upload Form') 
} 

function processForm(theForm) { 
    var fileBlob = theForm.fileUpload; 

    Logger.log("fileBlob Name: " + fileBlob.getName()) 
    Logger.log("fileBlob type: " + fileBlob.getContentType()) 
    Logger.log('fileBlob: ' + fileBlob); 

    var fldrSssn = DriveApp.getFolderById('my Google Drive folder id'); 
    fldrSssn.createFile(fileBlob); 

    return true; 
} 

function formatMailBody(obj) { 
    var result = ""; 
    for (var key in obj) { 
    result += "<h4 style='text-transform: capitalize; margin-bottom: 0'>" + key + "</h4><div>" + obj[key] + "</div>"; 
    } 
    return result; 
} 

function doPost(e) { 

    try { 
    Logger.log(e); 
    record_data(e); 

    var mailData = e.parameters; 

    MailApp.sendEmail({ 
     to: TO_ADDRESS, 
     subject: "New Price List Uploaded", 
     htmlBody: formatMailBody(mailData) 
    }); 

    return ContentService 
      .createTextOutput(
      JSON.stringify({"result":"success", 
          "data": JSON.stringify(e.parameters) })) 
      .setMimeType(ContentService.MimeType.JSON); 
    } catch(error) { 
    Logger.log(error); 
    return ContentService 
      .createTextOutput(JSON.stringify({"result":"error", "error": e})) 
      .setMimeType(ContentService.MimeType.JSON); 
    } 
} 

function record_data(e) { 
    Logger.log(JSON.stringify(e)); 
    try { 
    var doc  = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = doc.getSheetByName('responses'); 
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; 
    var nextRow = sheet.getLastRow()+1; 
    var row  = [ new Date() ]; 
    for (var i = 1; i < headers.length; i++) { 
     if(headers[i].length > 0) { 
     row.push(e.parameter[headers[i]]); 
     } 
    } 
    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]); 
    } 
    catch(error) { 
    Logger.log(e); 
    } 
    finally { 
    return; 
    } 

} 

的.html

<form id="gform" autocomplete="on" method="POST" class="pure-form pure-form-stacked" 
action="script url" onsubmit="picUploadJs(this)"> 

<fieldset class="pure-group"> 
    <input name="fileUpload" type="file" /> 
</fieldset> 

<fieldset class="pure-group"> 
    <label for="manufacturer">Manufacturer: </label> 
    <input id="manufacturer" name="manufacturer" type="text" placeholder="Manufacturer Name" required/> 
</fieldset> 

<fieldset class="pure-group"> 
    <label for="issueDate">Date Issued: </label> 
    <input id="issueDate" name="issueDate" type="date" required /> 
</fieldset> 

<fieldset class="pure-group"> 
    <label for="info">Additional Info: </label> 
    <input id="info" name="info" type="text" placeholder="Any Additional Information"/> 
</fieldset> 

<fieldset class="pure-group"> 
    <input id="email" name="email" type="hidden" value="[email protected]"/> 
</fieldset> 

<button class="button-success pure-button button-xlarge"> 
    Upload</button> 

<div style="display:none;" id="thankyou_message"> 
    <div id="status" style="display: none"> 
    <h2>Uploading. Please wait...</h2> 
    </div> 
    </div> 

function picUploadJs(frmData) { 

document.getElementById('status').style.display = 'inline'; 

    google.script.run 
.withSuccessHandler(updateOutput) 
.processForm(frmData) 
}; 

function updateOutput() { 

var outputDiv = document.getElementById('status'); 
outputDiv.innerHTML = "<h2>File successfully uploaded!</h2><button class=\"pure-button\"><a href=\"page url" style=\"text-decoration: none;\">Upload another</a></button>"; 
    } 

原代码来自here

回答

0

我可能没有所有的行话是正确的,但你必须把表单提交字段放入变量能够在您的.GS脚本中使用它们。一旦你把它们变成变量,你可以“建立”一个你喜欢的文件名,并在将fileBlob写入文件时使用它。鉴于上面的代码中,你应该能够只修改processForm功能如下:

function processForm(theForm) { 
    var fileBlob = theForm.fileUpload; 
    var manufacturer = theForm.manufacturer; 
    var issueDate = theForm.issueDate; 
    var myNewFilename = manufacturer + '_' + issueDate + '.pdf'; 
    fileBlob.setName(myNewFilename); //set Name of the blob 
    var fldrSssn = DriveApp.getFolderById('my Google Drive folder id'); 
    fldrSssn.createFile(fileBlob); // create a file with the blob, name of the file will be the same as set by setName method 
    return true; 
} 

让我也注意到一些可能对未来的访客是有帮助的 - 如何写一个时间戳到文件名。使用Utilities.formatDate函数设置一个新变量,然后可以将此变量连接成上面示例中的文件名。以下是如何设置变量:

var myTS = Utilities.formatDate (new Date(), Session.getScriptTimeZone(), "yyyyMMdd_HHmmss--") ; 

格式是完全灵活的 - 只需查看函数的详细信息。

+0

非常感谢你!虽然没有马上工作,我结束了切换fldrSssn.createFile(myNewFilename);为fldrSssn.createFile(fileBlob);它非常完美! –

+0

谢谢,罗南,指出这个问题 - 我应该在发布之前测试它!无论如何,我已经为未来的访问者更新了上面的代码块。让我也注意一些可能对未来访问者有用的东西 - 如何在文件名中写入时间戳。您 – verbage

+0

我没有意识到编辑评论的五分钟限制,最后是上面的Frankenstein评论。相反,我将关于时间戳的全文添加到我的原始答案中。 – verbage