如何扩展Google应用脚本类

时间:2013-07-02 18:18:53

标签: javascript google-apps-script

我正在尝试在脚本中扩展类Sheet,并且在尝试执行以下操作时我得到Sheet未定义:

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
}

2 个答案:

答案 0 :(得分:3)

您无法扩展Google类的原型。您可以在问题跟踪器Issue 708

上找到有关此问题的评论

答案 1 :(得分:3)

到目前为止,只有Google,而不是其用户,可以执行此操作,具体而言,在GAS(Google Apps Script)中,可以扩展{不是本机JavaScript的类,这是Google的类},所以可以做一些事情'Sheet .prototype.MyMethod = function(..){..}',其中Google的这些类在每个{功能组件下的'Classes'下定义,{{3中的第一个'Calendar'} }}

  1. 能够扩展Google的课程将非常方便和自然,包括已知的解决方法(详见下文)也相当难看。事实上,我这个答案的创始人发布了这个答案,因为最重要的是我经常想要自己做这样的扩展,所以我很同情。想帮助别人尝试做同样的事情。但是...
  2. 为什么Google会阻止这种情况,至少对于用户自己使用而言,用户似乎不知道。虽然...
  3. 谷歌在这里感到沮丧,两者都削弱了他们所提供的东西。不知道为什么,令人遗憾的是两者并不令人惊讶:
    1. 虽然谷歌的GAS功能主要是JavaScript,实际上它可以说是最好的资产,但GAS实际上还有很多令人沮丧的事情。与JS相比没有文档记录的限制。
    2. Google沮丧地几乎从不告诉用户他们为什么会在做出这样的删除决定之前结束他们的产品,甚至没有警告,所以看到Google也不会告诉用户他们为什么会削弱他们的产品,这似乎并不令人惊讶。
  4. 此问题的正式报告是the official GAS reference(来自the issue tracker's Issue 708),这是关于该问题的官方网络讨论,包括显然任何人都可以投票对于此能力,当您登录Google时,点击讨论的明星或/并在那里发表评论请求。
  5. 已知的尝试,包括直接和&间接的,都失败了:
    1. NP4CP4:'this Qs 1st answer。原型 .MyMethod = ..'得到'ReferenceError:" Sheet"没有定义。'
    2. NP3LNQ:'SpreadsheetApp.getActiveSpreadsheet()。SheetgetActiveSheet()。原型 .MyMethod = ..'得'TypeError:无法读取属性"原型"来自undefined。'
    3. NP4CQR:'SpreadsheetApp.getActiveSpreadsheet()。getActiveSheet()。constructor .MyMethod = ..' 获取'TypeError:无法设置属性" MyMethod"未定义到"(类)@ 26d5fab1"。'
    4. NP4K1W:'__proto__(SpreadsheetApp.getActiveSpreadsheet()。getActiveSheet()) .MyMethod = ..'得'TypeError:无法设置属性" MyMethod" of null to"(class)@ b73c746"。'
  6. 问题的更多细节是{更早更具体的要求}回答'Object.getPrototypeOf'
  7. 解决方法包括:
    1. NP4J3T:将每个要添加的方法编码为普通函数调用(然后牺牲方法功能)。
    2. NP4IGZ:部分解决方案,对于此&许多情况下,课程不能扩展,是定义&相反,使用一个新类来存储一个链接到该对象(在原始类中)以进行扩展,并在新类中添加所需的新方法,并且(新的类中的痛苦部分)也重新实现每一个原始类的现有方法(可能会改变!),只需将每个方法实现为(委托)对原始方法的调用即可。
      1. 建议此解决方法可能是发布How can I extend UiApp with a new function?的原因,这似乎可能是尝试引用Issue response c3