获取斑点的字符串值传递应用脚本来e.parameter(Get String Value of Bl

2019-10-21 12:51发布

我正在使用此代码来获取传递给函数的斑点:

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

这是我的错误:

执行失败:类型错误:无法在斑点object.'arrayBlob找到getDataAsString功能”

我如何获得这个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...
}

我想该解决方案使用该脚本和一个以上的用户同时工作。

Answer 1:

我不知道为什么你正在使用的Blob的在这里的所有,你可以简单地与JSON工作,而不是。

但是,如果你有一个理由使用斑点,你可以通过你传递的形式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...
}

在您使用原来的方法,斑点本身就从未纳入的形式,你只是传递字符串“斑点”周围。

这是因为函数createHidden(名称,值); 预计两个字符串作为参数,因此它称为“的ToString()”的arrayBlob对象,返回字符串‘斑点’上。



Answer 2:

更新:

添加任何功能的全局变量

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

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那里工作的。 这并没有能解决问题,但你认为我的理解是怎么回事的一部分吗?



文章来源: Get String Value of Blob Passed to e.parameter in Apps Script