在 Apps 脚本中获取传递给 e.parameter 的 Blob 的字符串值
Get String Value of Blob Passed to e.parameter in Apps Script
我正在使用此代码将 blob 传递给函数:
function submit(e){
var arrayBlob = e.parameter.arrayBlob;
Logger.log("arrayBlob #2 = " + arrayBlob.getDataAsString());
这是我得到的错误:
Execution failed: TypeError: Can not find getDataAsString function in
the 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...
}
我希望该解决方案能与多个用户同时使用该脚本一起工作。
更新:
添加任意函数的全局变量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
.[=38 引用它=]
如果在 submit()
函数中放入 Logger.log()
语句。
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
可以改进。这并没有解决您的问题,但您认为我能理解部分问题吗?
我完全不确定您为什么要在这里使用 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 本身从未包含在表单中,您只是简单地传递字符串 "Blob"。
这是因为函数createHidden(name, value);需要两个字符串作为参数,因此它在 arrayBlob 对象上调用“.toString()”,其中 returns 字符串 "Blob".
我正在使用此代码将 blob 传递给函数:
function submit(e){
var arrayBlob = e.parameter.arrayBlob;
Logger.log("arrayBlob #2 = " + arrayBlob.getDataAsString());
这是我得到的错误:
Execution failed: TypeError: Can not find getDataAsString function in the 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...
}
我希望该解决方案能与多个用户同时使用该脚本一起工作。
更新:
添加任意函数的全局变量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
.
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
.[=38 引用它=]
如果在 submit()
函数中放入 Logger.log()
语句。
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
可以改进。这并没有解决您的问题,但您认为我能理解部分问题吗?
我完全不确定您为什么要在这里使用 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 本身从未包含在表单中,您只是简单地传递字符串 "Blob"。
这是因为函数createHidden(name, value);需要两个字符串作为参数,因此它在 arrayBlob 对象上调用“.toString()”,其中 returns 字符串 "Blob".