9

我正在尝试在脚本中扩展类 Sheet ,当它尝试执行以下操作时,我得到 Sheet is undefined :

Sheet.prototype.moveColumn = function(SourceIndex, DestinationIndex){
  var source = this.getRange(1, SourceIndex, ss.getLastRow(), 1).getValues()
  var move = SourceIndex-DestinationIndex>0 ? sheet.getRange(1, DestinationIndex,  ss.getLastRow(), SourceIndex-DestinationIndex).getValues() : sheet.getRange(1, SourceIndex, ss.getLastRow(), DestinationIndex-SourceIndex).getValues();
  sheet.getRange(1, DestinationIndex, source.length, 1).setValues(source);
  SourceIndex-DestinationIndex>0 ? sheet.getRange(1, DestinationIndex+1, move.length, move[0].length).setValues(move) : sheet.getRange(1, SourceIndex, move.length, move[0].length);
  return this
}
4

2 回答 2

10

到目前为止,只有谷歌,而不是它的用户,可以做到这一点,具体来说,在GAS(Google Apps Script)中,可以扩展{非原生 JavaScript 的类,它们是 Google 的类},所以可以做一些事情'< a href="https://developers.google.com/apps-script/reference/spreadsheet/sheet" rel="noreferrer">Sheet.prototype.MyMethod= function(..) {..}',其中这些类由 Google 在官方 GAS 参考中的每个 {功能组件,作为第一个“日历”} 下的“类”下定义。

  1. 能够扩展 Google 的类将是非常方便和自然的,包括已知的变通方法(详述如下)也相当丑陋。事实上,我这个答案的创始人发布了这个答案,因为最重要的是我经常想自己做这样的扩展,所以很同情并想帮助其他人尝试做同样的事情。但...
  2. 谷歌为什么会阻止这一点,至少是为了用户自己的使用,用户似乎不知道。尽管...
  3. 谷歌在这里感到不安,既削弱了他们提供的东西又不说明原因,遗憾的是,两者都不足为奇:
    1. 虽然 Google 的 GAS 功能主要是 JavaScript,并且确实可以说是它的最佳资产,但与 JS 相比,GAS 实际上有更多令人不安和未记录的限制。
    2. 令人沮丧的是,谷歌几乎从不告诉用户他们为什么要终止他们的产品,甚至在做出这样的删除决定之前也不会发出警告,所以看到谷歌也不告诉用户他们为什么削弱他们的产品似乎并不奇怪。
  4. 这个问题的官方报告是问题跟踪器的问题 708(来自这个 Qs 1st answer),这是关于这个问题的官方网络讨论,包括显然 - 任何人都可以在签名时投票支持此功能进入谷歌,点击讨论的星号或/和评论那里请求它。
  5. 已知的尝试,无论是直接的还是间接的,都失败了:
    1. NP4CP4:'<a href="https://developers.google.com/apps-script/reference/spreadsheet/sheet" rel="noreferrer">Sheet.prototype .MyMethod= ..' 得到 'ReferenceError: "Sheet"未定义。'</li>
    2. NP3LNQ:'SpreadsheetApp.getActiveSpreadsheet()。获取活动表()构造函数.prototype .MyMethod= ..' 得到 'TypeError: Cannot read property "prototype" from undefined.'</li>
    3. NP4CQR:'SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()。__proto__ .MyMethod= ..' 获取 'TypeError: Cannot set property "MyMethod" of undefined to "(class)@26d5fab1"。'</li>
    4. NP4K1W:'<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf" rel="noreferrer">Object.getPrototypeOf(SpreadsheetApp.getActiveSpreadsheet( ).getActiveSheet()) .MyMethod= ..' 获取 'TypeError: Cannot set property "MyMethod" of null to "(class)@b73c746"。'</li>
  6. 该问题的更多细节在 {earlier more-specific request} answer'<a href="https://stackoverflow.com/questions/12185587/how-can-i-extend-uiapp-with-a-new -function/12185925#answer-12185925">如何使用新功能扩展 UiApp?
  7. 解决方法包括:
    1. NP4J3T:将要添加的每个方法编码为普通函数调用(因此牺牲方法功能)。
    2. NP4IGZ:一种部分解决方法,对于这种情况和许多不扩展类的情况是正确的,是定义并改为使用一个新类,该类存储指向要扩展的对象(在原始类中)的链接,并在新类添加了所需的新方法,并且(痛苦的部分)在新类中还重新实现了每个原始类的现有方法(可能会改变!),这将需要每个都被实现为(委托给)对原始方法的调用。
      1. 建议这种解决方法可能是发布问题响应 c3的原因,这似乎是在尝试引用GAS 包装器类示例 HeaderRow
于 2015-05-29T22:02:39.043 回答
5

您不能扩展 Google 类的原型。您可以在问题跟踪器问题 708上找到有关此问题的评论

于 2013-07-02T19:03:29.013 回答