繁体   English   中英

Google表格脚本-“无法读取未定义的属性”(如果不是)

[英]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行,“主”文件)

为什么我的对象未定义? 我定义了:

  • 电子表格网址
  • sheetName
  • 我已经将这些传递给我的函数调用
  • 最后在同一项目的单独文件中定义了该函数

是什么赋予了? 谢谢!

您不应该尝试使用 this来修改您不拥有的对象。 特别是在Google Apps脚本中。 据我所知 this实际上指的是包含所有Google Apps脚本本身的服务代码的对象。

\n

创建自己的对象并传递它们,而不用在全局范围内更改对象,尽管从技术上讲,它将所有内容填充到该对象中并对其进行引用是不鼓励的。

我的推理不正确。 我张贴的问题仍然存在。

问题:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM