GAS e.parameter undefined,uploadWidget不会setName

时间:2014-03-09 02:02:20

标签: google-apps-script

我正在为另一个问题here找回答案。我已经从here修改了一个不同的教程脚本,但我遇到的问题是fileUploadWidget的e.parameter不接受.setName()更改。无论我使用setName做什么,它都会继续将“name”显示为FileUpload,并且不会将e.parameter.'file'+ numRows传递给uploadFiles(e)(以前的doPost(e))。 folderName参数将通过,但numRows将作为NaN传入,而文件+ numRows将通过undefined传递。这里发生了什么/我错过了什么?我已经完成了大量的解决方案,但似乎无法找出出错的地方。也许一组具有更多经验的新鲜眼睛可以看出我做错了什么。

您可以在行动here

中找到此代码的示例
//modified from script found here http://www.googleappsscript.org/miscellaneous/creating-form-elements-dynamically-using-google-apps-script-gas
function doGet() {
  var app = UiApp.createApplication();
  var panel = app.createVerticalPanel();
  var formPanel = app.createFormPanel();
  var folderLabel = app.createLabel('Folder Name (temp placeholder to remember to use .getFolderById(folderId) to place in specific folder)');
  var folderNameTextBox = app.createTextBox().setId('folderName').setName('folderName');
  var filesLabel = app.createLabel('Add Files to Upload');
  var table = app.createFlexTable().setId('table').setTag('0'); //Here tag will count the number of members
  //Write the header for the table
  var headerArray = ['File(s)'];
  for(var i=0; i<headerArray.length; i++){
    table.setWidget(0, i, app.createLabel(headerArray[i]));
  }
  //Add the first row of form elelments to input Member information
  addMemebrRow(app);

  //Add a button to submit the info
  var button = app.createSubmitButton('Upload File(s)');
  var handler = app.createServerHandler('uploadFiles');
  handler.addCallbackElement(panel);
  button.addClickHandler(handler);
  panel.add(folderLabel)
    .add(folderNameTextBox)
    .add(filesLabel)
    .add(table)
    .add(button);
  formPanel.add(panel);
  app.add(formPanel);
  return app;
}

function addMemebrRow(app){
  var table = app.getElementById('table');
  var tag = parseInt(table.getTag());
  Logger.log(tag);
  var numRows = tag+1;
  if(numRows >1){
    table.removeCell(numRows-1, 5);
    table.removeCell(numRows-1, 4);
  }
  Logger.log(numRows);
  var uploadWidget = app.createFileUpload();
  var uploadWidgetName = uploadWidget.setName('file'+numRows);
  var uploadWidgetId = uploadWidget.setId('file'+numRows);
  Logger.log(uploadWidgetId.getId());
  Logger.log(uploadWidgetName);
  table.setWidget(numRows, 0, uploadWidget);
  table.setTag(numRows.toString());
  addButtons(app);
}

function addButtons(app){
  var table = app.getElementById('table');
  var numRows = parseInt(table.getTag());

  //Create handler to add/remove row
  var addRemoveRowHandler = app.createServerHandler('_addRemoveRow');
  addRemoveRowHandler.addCallbackElement(table);

  //Add row button and handler
  var addRowBtn = app.createButton('+').setId('addOne').setTitle('Add row');
  table.setWidget(numRows, 4, addRowBtn);
  addRowBtn.addMouseUpHandler(addRemoveRowHandler);

  //remove row button and handler
  var removeRowBtn = app.createButton('-').setId('removeOne').setTitle('Remove row');
  table.setWidget(numRows, 5, removeRowBtn);
  removeRowBtn.addMouseUpHandler(addRemoveRowHandler);
}

function _addRemoveRow(e){
  Logger.log(e.parameter.source);
  var app = UiApp.getActiveApplication();
  var table = app.getElementById('table');
  var tag = parseInt(e.parameter.table_tag);
  var source = e.parameter.source;
  //Logger.log(tag);
  if(source == 'addOne'){
    table.setTag(tag.toString());
    addMemebrRow(app);
  }
  else if(source == 'removeOne'){
    if(tag > 1){
      //Dcrement the tag by one
      var numRows = tag-1;
      table.removeRow(tag);
      //Set the new tag of the table
      table.setTag(numRows.toString());
      //Add buttons in previous row
      addButtons(app); 
    }
  }
  return app;
}

function uploadFiles(e) {
  var foldername = e.parameter.folderName;
  Logger.log(foldername);
  var numFiles = parseInt(e.parameter.table_tag);
  Logger.log(numFiles);
  for (var i = 1; i<=numFiles; i++){
    Logger.log(i);
    var fileBlob = e.parameter['file'+i];
    var newFile = DocsList.getFolderById("0B2p9JhtmHqC8Q0lIQk1mMERQTW8").createFile(fileBlob);
  }
  var app = UiApp.getActiveApplication();
  var label = app.createLabel(numFiles +' file(s) uploaded successfully');
  app.add(label);
  return app;
}

1 个答案:

答案 0 :(得分:0)

表单中的文件上传需要doPost函数才能工作,这不是一个选项;)

在这样的结构(doGet / doPost)中,您不必定义处理程序或callBackElement,formPanel应该自动包含其所有元素。

所以我尝试了修改后的代码,但仍然遇到表标记上的numFiles值的一个主要问题:我无法得到它......

如果我用固定值替换它,那么一切都很好用,我把文件放在正确的文件夹中。

所以这个答案不是一个好的答案,因为它没有带来完整的解决方案,但至少它将其初始范围缩小到了这一点:如何获得#@!#! numFiles值?


编辑:发现问题: 表不支持setName方法,因此无法在submitHandler中检索其值。我们应该使用另一个小部件来保存该值。

下面的新工作代码:(我使用textBox作为“隐藏”小部件仅供测试,请在生产时替换为hiddenWidget)

function doGet() {
  var app = UiApp.createApplication();
  var panel = app.createVerticalPanel();
  var formPanel = app.createFormPanel();
  var folderLabel = app.createLabel('Folder Name (temp placeholder to remember to use .getFolderById(folderId) to place in specific folder)');
  var folderNameTextBox = app.createTextBox().setId('folderName').setName('folderName');
  var filesLabel = app.createLabel('Add Files to Upload');
  var table = app.createFlexTable().setId('table').setTag('0'); //Here tag will count the number of members
  //Write the header for the table
  var headerArray = ['File(s)'];
  for(var i=0; i<headerArray.length; i++){
    table.setWidget(0, i, app.createLabel(headerArray[i]));
  }
  //Add the first row of form elelments to input Member information
  addMemebrRow(app);
  var hidden = app.createTextBox().setName('hidden').setId('hidden').setValue(table.getTag());// used to hold the number of files, replace with createHidden()
  //Add a button to submit the info
  var button = app.createSubmitButton('Upload File(s)');
  panel.add(folderLabel)
    .add(folderNameTextBox)
    .add(filesLabel)
    .add(table)
    .add(button);
  formPanel.add(panel.add(hidden));
  app.add(formPanel);
  return app;
}

function addMemebrRow(app){
  var table = app.getElementById('table');
  var tag = Number(table.getTag());
  Logger.log('tag='+tag);
  var numRows = tag+1;
  if(numRows >1){
    table.removeCell(numRows-1, 5);
    table.removeCell(numRows-1, 4);
  }
  Logger.log(numRows);
  var uploadWidget = app.createFileUpload();
  var uploadWidgetName = uploadWidget.setName('file'+numRows);
  var uploadWidgetId = uploadWidget.setId('file'+numRows);
  Logger.log(uploadWidgetId.getId());
  Logger.log(uploadWidgetName);
  table.setWidget(numRows, 0, uploadWidget);
  table.setTag(numRows);
  addButtons(app);
}

function addButtons(app){
  var table = app.getElementById('table');
  var numRows = Number(table.getTag());

  //Create handler to add/remove row
  var addRemoveRowHandler = app.createServerHandler('_addRemoveRow');
  addRemoveRowHandler.addCallbackElement(table);

  //Add row button and handler
  var addRowBtn = app.createButton('+').setId('addOne').setTitle('Add row');
  table.setWidget(numRows, 4, addRowBtn);
  addRowBtn.addMouseUpHandler(addRemoveRowHandler);

  //remove row button and handler
  var removeRowBtn = app.createButton('-').setId('removeOne').setTitle('Remove row');
  table.setWidget(numRows, 5, removeRowBtn);
  removeRowBtn.addMouseUpHandler(addRemoveRowHandler);
}

function _addRemoveRow(e){
  Logger.log(e.parameter.source);
  var app = UiApp.getActiveApplication();
  var hidden = app.getElementById('hidden');
  var table = app.getElementById('table');
  var tag = Number(e.parameter.table_tag);
  var source = e.parameter.source;
  //Logger.log(tag);
  if(source == 'addOne'){
    table.setTag(tag.toString());
    hidden.setValue(tag+1);
    addMemebrRow(app);
  }
  else if(source == 'removeOne'){
    if(tag > 1){
      //Dcrement the tag by one
      var numRows = tag-1;
      table.removeRow(tag);
      //Set the new tag of the table
      table.setTag(numRows);
      hidden.setValue(numRows);
      //Add buttons in previous row
      addButtons(app); 
    }
  }
  return app;
}

function doPost(e) {
  var foldername = e.parameter.folderName;
  Logger.log('foldername = '+foldername);
  var numFiles = Number(e.parameter.hidden);
  Logger.log('numFiles = '+numFiles);
  for (var i = 1; i<=numFiles; i++){
    Logger.log(i);
    var fileBlob = e.parameter['file'+i];
    var newFile = DocsList.getFolderById("0B3qSFd3iikE3QXdubnVoMXlGMkk").createFile(fileBlob);
  }
  var app = UiApp.getActiveApplication();
  var label = app.createLabel(numFiles +' file(s) uploaded successfully');
  app.add(label);
  return app;
}