获取Blob的字符串值传递给Apps脚本中的e.parameter

时间:2015-01-06 18:55:55

标签: javascript google-apps-script google-sheets blob

我正在使用此代码将blob传递给函数:

function submit(e){
  var arrayBlob = e.parameter.arrayBlob;
  Logger.log("arrayBlob #2 = " + arrayBlob.getDataAsString()); 

这是我得到的错误:

  

执行失败:TypeError:找不到getDataAsString函数   Blob object.'arrayBlob'

如何获取此blob的字符串值?

这是我的代码:

function showList(folderID) {
  var folder = DocsList.getFolderById(folderID);
  var files = folder.getFiles();
  var arrayList = [];
  for (var file in files) {
    file = files[file];
    var thesesName = file.getName();
    var thesesId = file.getId();
    var thesesDoc = DocumentApp.openById(thesesId);
    for (var child = 0; child < thesesDoc.getNumChildren(); child++){
    var thesesFirstParagraph = thesesDoc.getChild(child);
    var thesesType = thesesFirstParagraph.getText();
      if (thesesType != ''){
         var newArray = [thesesName, thesesType, thesesId];
         arrayList.push(newArray);
         break;
         }
      }
   }
  arrayList.sort();
  var result = userProperties.getProperty('savedArray');
    arrayList =  JSON.stringify(arrayList);
    var arrayBlob = Utilities.newBlob(arrayList);
    Logger.log("arrayBlob #1 = " + arrayBlob.getDataAsString()); // Here it`s OK
    var mydoc = SpreadsheetApp.getActiveSpreadsheet();
    var app = UiApp.createApplication().setWidth(550).setHeight(450);
    var panel = app.createVerticalPanel()
                   .setId('panel');
    panel.add(app.createHidden('arrayBlob', arrayBlob)); 
    var label = app.createLabel("Selecione os itens desejados").setStyleAttribute("fontSize", 18);
    app.add(label);
    arrayList =  JSON.parse(arrayList);
    panel.add(app.createHidden('checkbox_total', arrayList.length)); 
    for(var i = 0; i < arrayList.length; i++){
      var checkbox = app.createCheckBox().setName('checkbox_isChecked_'+i).setText(arrayList[i][0]);
      Logger.log("arrayList[i][0] = " + arrayList[i][0]);
      Logger.log("arrayList[i] ====> " + arrayList[i]);
      panel.add(checkbox);
   }
   var handler = app.createServerHandler('submit').addCallbackElement(panel);
   panel.add(app.createButton('Submit', handler));
   var scroll = app.createScrollPanel().setPixelSize(500, 400);
   scroll.add(panel);
   app.add(scroll);
   mydoc.show(app);
}

function submit(e){
  var arrayBlob = e.parameter.arrayBlob;
  Logger.log("arrayBlob #2 = " + arrayBlob.getDataAsString()); 


 // Continues...
}

我希望该解决方案可以使用该脚本同时与多个用户同时使用。

2 个答案:

答案 0 :(得分:2)

更新

添加任何功能的全局变量 OUTSIDE

var arrayBlob = Utilities.newBlob("dummy data");

function showList(folderID) {
   Code here ....
};

检查代码是否可以访问blob:

function submit(e){
  Logger.log("arrayBlob.getDataAsString(): " + arrayBlob.getDataAsString());
  //More Code . . . 
}

此解决方案无需在对话框中使用blob值嵌入隐藏元素。

您不需要这一行:

panel.add(app.createHidden('arrayBlob', arrayBlob));

我对代码进行了其他更改,但我只想展示主要问题。

旧信息:

在函数showList()中,方法getDataAsString()适用于名为arrayBlob的blob。

Logger.log("arrayBlob #1 = " + arrayBlob.getDataAsString()); // Here it`s OK

在函数submit()中,相同的方法不起作用。

var arrayBlob = e.parameter.arrayBlob;

在函数showList()中,代码将newBlob赋给变量arrayBlob。因此arrayBlob可以使用getDataAsString()方法。

var arrayBlob = Utilities.newBlob(arrayList);

在函数submit()中,您尝试将arrayBlob blob变量传递到submit()函数,并使用e.parameter引用它。

如果您在Logger.log()函数中添加submit()语句。

function submit(e){
  Logger.log('e: ' + e);
  Logger.log('e.parameter` + e.parameter);

  var arrayBlob = e.parameter.arrayBlob;

那些Logger.log语句应该在其中显示一些内容。如果e.parameter中没有任何内容,则.getDataAsString()无需处理任何内容。

看起来您正在将arrayBlob放入隐藏面板中。

panel.add(app.createHidden('arrayBlob', arrayBlob));

但是当对象传递给submit(e)函数时,arrayBlob可能无法放入该对象。

所以,我所说的是:

Logger.log("arrayBlob #2 = " + arrayBlob.getDataAsString());

线条可能非常好,但没有arrayBlob可供使用。这并没有解决你的问题,但你认为我正在理解发生了什么吗?

答案 1 :(得分:0)

我不确定你为什么要在这里使用Blob,你可以简单地使用JSON。

但是,如果您有理由使用Blob,则可以通过表单传递JSON数据并在处理程序中创建Blob,如下面的修改代码所示:

function showList(folderID) {
  var folder = DocsList.getFolderById(folderID);
  var files = folder.getFiles();
  var arrayList = [];
  for (var file in files) {
    file = files[file];
    var thesesName = file.getName();
    var thesesId = file.getId();
    var thesesDoc = DocumentApp.openById(thesesId);
    for (var child = 0; child < thesesDoc.getNumChildren(); child++){
    var thesesFirstParagraph = thesesDoc.getChild(child);
    var thesesType = thesesFirstParagraph.getText();
      if (thesesType != ''){
         var newArray = [thesesName, thesesType, thesesId];
         arrayList.push(newArray);
         break;
         }
      }
   }
  arrayList.sort();

  var result = UserProperties.getProperty('savedArray');

  //get JSON data pass through form. 
  var arrayBlob = JSON.stringify(arrayList);   

  var mydoc = SpreadsheetApp.getActiveSpreadsheet();
  var app = UiApp.createApplication().setWidth(550).setHeight(450);
  var panel = app.createVerticalPanel()
  .setId('panel');

  //include JSON Data in the form.
  panel.add(app.createHidden('arrayBlob', arrayBlob));  

  var label = app.createLabel("Selecione os itens desejados").setStyleAttribute("fontSize", 18);
  app.add(label);

  panel.add(app.createHidden('checkbox_total', arrayList.length)); 
  for(var i = 0; i < arrayList.length; i++){
    var checkbox = app.createCheckBox().setName('checkbox_isChecked_'+i).setText(arrayList[i][0]);
    Logger.log("arrayList[i][0] = " + arrayList[i][0]);
    Logger.log("arrayList[i] ====> " + arrayList[i]);
    panel.add(checkbox);
  }
  var handler = app.createServerHandler('submit').addCallbackElement(panel);
  panel.add(app.createButton('Submit', handler));
  var scroll = app.createScrollPanel().setPixelSize(500, 400);
  scroll.add(panel);
  app.add(scroll);
  mydoc.show(app);
}

function submit(e){
  var arrayBlob = Utilities.newBlob(e.parameter.arrayBlob);
  Logger.log("arrayBlob #2 = " + arrayBlob.getDataAsString()); 

 // Continues...
}

在您最初使用的方法中,Blob本身从未包含在表单中,您只是传递字符串&#34; Blob&#34;周围。

这是因为函数createHidden(name,value);期望两个字符串作为参数,因此它调用&#34; .toString()&#34;在arrayBlob对象上,返回字符串&#34; Blob&#34;。