如何重命名上传到应用程序脚本 Web 应用程序表单的文件?

2024-03-02

我通过将我找到的一些代码拼接在一起制作了一个小型网络应用程序表单。它对我来说几乎完美,允许我将文件上传到 Google Drive 文件夹,将表单中提交的数据记录在电子表格中,并在文件上传时向我发送电子邮件。

但是,我真正想要做的是根据表单数据重命名上传的文件。例如,如果输入的制造商值 =“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] /cdn-cgi/l/email-protection"/>
</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 https://stackoverflow.com/questions/21013693/google-forms-file-upload-complete-example

and here https://github.com/dwyl/html-form-send-email-via-google-script-without-server/blob/master/google-apps-script.js


我可能没有正确理解所有行话,但您必须将表单提交字段转换为变量才能在 .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--") ;

格式完全灵活——只需查找函数即可了解详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重命名上传到应用程序脚本 Web 应用程序表单的文件? 的相关文章

随机推荐