我正在使用此代码来获取传递给函数的斑点:
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...
}
我想该解决方案使用该脚本和一个以上的用户同时工作。
我不知道为什么你正在使用的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对象,返回字符串‘斑点’上。
更新:
添加任何功能的全局变量外 :
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
那里工作的。 这并没有能解决问题,但你认为我的理解是怎么回事的一部分吗?