我正试图解构一个Google-Team's script以便从AdWords获取报告并将其写入Google表格电子表格。我正在Apps编辑器中对其进行测试,并收到“无法读取未定义...”错误。
我的项目中目前有两个.gs文件:
1.函数定义(“类”),empty_row.gs
文件:
function SpreadsheetAccess(spreadsheetUrl, sheetName) {
this.spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);
this.sheet = spreadsheet.getSheetByName(sheetName);
this.findEmptyRow = function(minRow, column) {
var values = this.sheet.getRange(minRow, column, this.sheet.getMaxRows(), 1).getValues();
for (var i = 0; i < values.length; i++) {
if(!values[i][0]) {
return i + minRow;
}
}
return -1;
};
this.addRows = function(howMany){
this.sheet.insertRowsAfter(this.sheet.getMaxRows(), howMany);
};
this.writeRows = function(){
this.sheet.getRange(startRow, startColumn, rows.length, rows[0].length).setValue(rows);
};
}
2.以及一个实例化对象的
main.gs
文件:var spreadsheetUrl = 'https://docs.google.com/spreadsheets/d/someurl/edit#gid=1540200210';
var sheetName = 'baba';
function main() {
var object = SpreadsheetAccess(spreadsheetUrl, sheetName);
var emptyRow = object.findEmptyRow(1, 1);
Logger.log("The empty row is: %s", emptyRow);
}
当我运行
main{}
时,我得到了:TypeError:无法调用未定义的方法“ findEmptyRow”。 (第6行,“主”文件)
为什么我的对象未定义?我定义了:
电子表格网址
sheetName
我已经将这些传递给我的函数调用
最后在同一项目的单独文件中定义了该函数
是什么赋予了?谢谢!
最佳答案
您不应该尝试使用this
修改您不拥有的对象。特别是在Google Apps脚本中。 AFAIK this
实际上是指包含Apps Script本身的所有服务代码的对象。
创建自己的对象并传递它们,而不用在全局范围内更改对象,尽管从技术上讲,它将所有内容填充到该对象中并对其进行引用是不鼓励的。
我的推理不正确。我张贴的问题仍然存在。
问题:
未定义object
,因为您没有从SpreadsheetAccess()
返回值。没有定义任何内容,因为没有返回任何内容。
解决方案1
这是您的代码,有两个更改。更新SpreadsheetAccess函数,并将spreadsheet.getSheetByName(sheetName);
更改为this.spreadsheet.getSheetByName(sheetName);
var spreadsheetUrl = 'https://docs.google.com/spreadsheets/d/someurl/edit#gid=1540200210';
var sheetName = 'baba';
function main() {
var object = new SpreadsheetAccess(spreadsheetUrl, sheetName);
var emptyRow = object.findEmptyRow(1, 1);
Logger.log("The empty row is: %s", emptyRow);
}
function SpreadsheetAccess(spreadsheetUrl, sheetName) {
this.spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);
this.sheet = this.spreadsheet.getSheetByName(sheetName);
this.findEmptyRow = function(minRow, column) {
var values = this.sheet.getRange(minRow, column, this.sheet.getMaxRows(), 1).getValues();
for (var i = 0; i < values.length; i++) {
if(!values[i][0]) {
return i + minRow;
}
}
return -1;
};
this.addRows = function(howMany){
this.sheet.insertRowsAfter(this.sheet.getMaxRows(), howMany);
};
this.writeRows = function(){
this.sheet.getRange(startRow, startColumn, rows.length, rows[0].length).setValue(rows);
};
}
解决方案2
这是我修改后的代码,该代码有效,我已经使用自己的电子表格对其进行了测试:
var spreadsheetUrl = 'https://docs.google.com/spreadsheets/d/someurl/edit#gid=1540200210';
var sheetName = 'baba';
function main() {
var myObject = SpreadsheetAccess(spreadsheetUrl, sheetName);
var emptyRow = myObject.findEmptyRow(1, 1);
Logger.log("The empty row is: %s", emptyRow);
}
function SpreadsheetAccess(spreadsheetUrl, sheetName) {
var myObject = {};
myObject.spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);
myObject.sheet = myObject.spreadsheet.getSheetByName(sheetName);
myObject.findEmptyRow = function(minRow, column) {
var values = myObject.sheet.getRange(minRow, column, myObject.sheet.getMaxRows(), 1).getValues();
for (var i = 0; i < values.length; i++) {
if(!values[i][0]) {
return i + minRow;
}
}
return -1;
};
myObject.addRows = function(howMany){
myObject.sheet.insertRowsAfter(myObject.sheet.getMaxRows(), howMany);
};
myObject.writeRows = function(startRow, startColumn, rows){
myObject.sheet.getRange(startRow, startColumn, rows.length, rows[0].length).setValue(rows);
};
return myObject;
}
关于javascript - Google表格脚本-“无法读取未定义的属性”(如果不是),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36867293/