3

我想使用包装函数在 Google Apps Script 中扩展(原型)UiApp,但是在运行如下简单示例时出现 TypeError ......我做错了什么?

Object.prototype.addLabel = function(text) {   
  this.createLabel(text);
  return this;
}

function testingxUiApp() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var app = UiApp.createApplication().setTitle('playing around UiApp').setHeight("250");
  var panel = app.createFlowPanel().setId('panel');
  app.add(panel);
  panel.add(app.addLabel("adding label for testing"));
  doc.show(app);
}

谢谢

4

2 回答 2

3

无法扩展 UiApp、Document、Spreadsheet 等高阶类。谷歌阻止了它。如果要执行该var isObject = UiApp.createApplication() instanceof Object;行,则isObject为 false,尽管typeof UiApp.createApplication();表达式返回object.

于 2012-08-29T20:24:39.227 回答
0

顺便说一句,2021 年的注释:(来自https://b.corp.google.com/issues/36753527

看起来 V8 中使用的 Reflect 可以解决问题:

  Reflect.set(
    Reflect.getPrototypeOf(SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Some sheet')),
    'myMethod',
    function() {
      return `From sheet '${this.getSheetName()}' with love`;
    }
  );

  let message = SpreadsheetApp.getActiveSheet().myMethod();
  console.log(message); // From sheet 'Sheet1' with love`
于 2021-12-14T21:28:01.213 回答