GAS e.parameter undefined,uploadWidget不会setName [英] GAS e.parameter undefined, uploadWidget won't setName

查看:147
本文介绍了GAS e.parameter undefined,uploadWidget不会setName的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为另一个问题找到答案此处。我修改了中的其他教程脚本这里,但我有一个问题,即fileUploadWidget的e.parameter不会接受.setName()更改。无论我用setName做什么,它都会继续将name显示为FileUpload,并且不会将e.parameter.'file'+ numRows传递给uploadFiles(e)(以前称为doPost(e))。 folderName参数会通过,但是numRows以NaN形式出现,并且文件+ numRows通过未定义。这里发生了什么/我错过了什么?我已经经历了很多关于SO的解决方案,但似乎无法弄清楚出现这种情况的原因。也许一个有更多经验的新眼睛可以看到我做错了什么。



你可以在 here

  / /从此处找到的脚本修改http://www.googleappsscript.org/miscellaneous/creating-form-elements-dynamically-using-google-apps-script-gas 
函数doGet(){
var app = UiApp.createApplication();
var panel = app.createVerticalPanel();
var formPanel = app.createFormPanel();
var folderLabel = app.createLabel('文件夹名称(需要记住要使用.getFolderById(folderId)放置在特定文件夹中的临时占位符)');
var folderNameTextBox = app.createTextBox()。setId('folderName')。setName('folderName');
var filesLabel = app.createLabel('Add Files to Upload');
var table = app.createFlexTable()。setId('table')。setTag('0'); //这里标签会计算成员的数量
//为表格写入标题
var headerArray = ['File(s)'];
for(var i = 0; i< headerArray.length; i ++){
table.setWidget(0,i,app.createLabel(headerArray [i]));
}
//添加第一行表单元素以输入成员信息
addMemebrRow(app);

//添加一个按钮提交信息
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);
返回应用程序;
}

函数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);
}

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

//创建处理程序以添加/删除行
var addRemoveRowHandler = app.createServerHandler('_ addRemoveRow');
addRemoveRowHandler.addCallbackElement(table);

//添加行按钮和处理程序
var addRowBtn = app.createButton('+').setId('addOne')。setTitle('Add row');
table.setWidget(numRows,4,addRowBtn);
addRowBtn.addMouseUpHandler(addRemoveRowHandler);

//删除行按钮和处理程序
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){
//将标签放一个
var numRows =标签-1;
table.removeRow(tag);
//设置表格的新标签
table.setTag(numRows.toString());
//在前一行添加按钮
addButtons(app);
}
}
返回应用;
}

function uploadFiles(e){
var foldername = e.parameter.folderName;
Logger.log(文件夹名称);
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 +'文件');
app.add(label);
返回应用程序;


解决方案

doPost 函数可以工作,这不是一个选项;)

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



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



如果我



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






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



新的工作代码如下:(我使用textBox作为隐藏生产中用hiddenWidget替换)

 函数doGet(){
var app = UiApp.createApplication();
var panel = app.createVerticalPanel();
var formPanel = app.createFormPanel();
var folderLabel = app.createLabel('文件夹名称(需要记住要使用.getFolderById(folderId)放置在特定文件夹中的临时占位符)');
var folderNameTextBox = app.createTextBox()。setId('folderName')。setName('folderName');
var filesLabel = app.createLabel('Add Files to Upload');
var table = app.createFlexTable()。setId('table')。setTag('0'); //这里标签会计算成员的数量
//为表格写入标题
var headerArray = ['File(s)'];
for(var i = 0; i< headerArray.length; i ++){
table.setWidget(0,i,app.createLabel(headerArray [i]));
}
//添加第一行表单元素以输入成员信息
addMemebrRow(app);
var hidden = app.createTextBox().setName('hidden').setId('hidden')。setValue(table.getTag()); //用于保存文件数量,用createHidden( )
//添加一个按钮来提交信息
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);
返回应用程序;
}

函数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);
}

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

//创建处理程序以添加/删除行
var addRemoveRowHandler = app.createServerHandler('_ addRemoveRow');
addRemoveRowHandler.addCallbackElement(table);

//添加行按钮和处理程序
var addRowBtn = app.createButton('+').setId('addOne')。setTitle('Add row');
table.setWidget(numRows,4,addRowBtn);
addRowBtn.addMouseUpHandler(addRemoveRowHandler);

//删除行按钮和处理程序
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){
//将标签放一个
var numRows =标签-1;
table.removeRow(tag);
//设置表格的新标签
table.setTag(numRows);
hidden.setValue(numRows);
//在前一行添加按钮
addButtons(app);
}
}
返回应用;
}

函数doPost(e){
var foldername = e.parameter.folderName;
Logger.log('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 +'文件');
app.add(label);
返回应用程序;
}


I'm working on an answer for another question found here. I have modified a different tutorial script from here, but I'm having an issue that the e.parameter for the fileUploadWidget will not accept a .setName() change. No matter what I do with setName, it continues to show the "name" as FileUpload, and won't pass the e.parameter.'file'+numRows on to the uploadFiles(e) (formerly doPost(e)). The folderName parameter will come through, but numRows is coming through as NaN, and the file+numRows is coming through undefined. What is going on here/What am I missing? I've been through tons of solutions on and off SO, but can't seem to figure out where this has gone wrong. Maybe a fresh set of eyes with more experience can see what I'm doing wrong.

You can find the example of this code in action 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;
}

解决方案

File upload in forms needs a doPost function to work, this is not an option ;)

In such a structure (doGet/doPost) you don't have to define a handler nor a callBackElement, the formPanel is supposed to include all its elements automatically.

So I tried your modified code and still get one major issue with the numFiles value that is on the table tag : I can't get it...

If I replace it with a fixed value then everything works nicely, I get the files in the right folder.

So this answer is not a good answer because it doesn't bring a full solution but at least it reduces its initial scope to that point : how to get this #@!#! numFiles value ?


EDIT : Found the issue : table doesn't support setName method so its value can't be retrieved in the submitHandler. We should use another widget to hold that value.

new working Code below : (I used a textBox as a "hidden" widget for test only, please replace by a hiddenWidget when in production)

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

这篇关于GAS e.parameter undefined,uploadWidget不会setName的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆