[英]Google Sheets script - “Cannot read property of undefined” (when it's not)
我正在尝试解构Google团队的脚本,以便从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行,“主”文件)
为什么我的对象未定义? 我定义了:
是什么赋予了? 谢谢!
您不应该尝试使用
this
来修改您不拥有的对象。
特别是在Google Apps脚本中。
据我所知
this
实际上指的是包含所有Google Apps脚本本身的服务代码的对象。
创建自己的对象并传递它们,而不用在全局范围内更改对象,尽管从技术上讲,它将所有内容填充到该对象中并对其进行引用是不鼓励的。
我的推理不正确。 我张贴的问题仍然存在。
问题:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.