我正试图解构一个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/

10-12 12:34
查看更多