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

これまでのところ、ユーザーではなく Google だけがこれを行うことができます。具体的にはGAS(Google Apps Script)で、{Google によるクラスであるネイティブ JavaScript ではないクラス} を拡張できるため、'< a href="https://developers.google.com/apps-script/reference/spreadsheet/sheet" rel="noreferrer">Sheet.prototype.MyMethod= function(..) {..}'、これらのクラス公式の GAS リファレンス の各 {機能コンポーネント、最初の 'Calendar' として) の下の 'Classes' で定義されています。

  1. Google のクラスを拡張できることは非常に便利で自然なことですが、既知の回避策 (詳細は後述) もかなり醜いものです。確かに、私はこの回答の作成者がこの回答を投稿します。なぜなら、何よりも私は定期的にこのような拡張機能を自分で作りたいと思っているので、共感し、他の人が同じことをしようとするのを助けたいからです。しかし...
  2. 少なくともユーザー自身の使用のために、Google がこれを防止する理由は、ユーザーには不明のようです。けれど...
  3. Google が提供するものを不自由にし、その理由を説明しないことで、ここで腹を立てていることは、悲しいことに驚くべきことではありません。
    1. Google の GAS 機能はほとんどが JavaScript であり、実際には間違いなく最高の資産ですが、GAS には実際には JS と比較して多くの動揺する文書化されていない制限があります。
    2. Google は動揺して、製品を終了する理由をユーザーに伝えたり、そのような削除の決定が下される前に警告したりすることはほとんどありません。
  4. それ以外の場合、この問題の公式レポートはイシュー トラッカーの問題 708 (この Q の最初の回答から) です。これは、問題に関する公式の Web ディスカッションであり、署名された場合、明らかに誰でもこの機能に投票できる場所を含みます。ディスカッションのスターをクリックするか、そこにコメントしてリクエストします。
  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()。getActiveSheet() . constructor .prototype .MyMethod= ..' は、'TypeError: Cannot read property "prototype" from undefined.' を取得します。</li>
    3. NP4CQR: 'SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(). __proto__ .MyMethod= ..' は、'TypeError: 未定義のプロパティ "MyMethod" を "(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: null のプロパティ "MyMethod" を "(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. この回避策を示唆するために、Issue response c3が投稿された理由である可能性があります。これは、 GAS ラッパー クラスの例 HeaderRowを参照しようとしている可能性があるようです。
于 2015-05-29T22:02:39.043 に答える
5

Google のクラスのプロトタイプを拡張することはできません。これに関するコメントは、Issue Tracker、Issue 708で見つけることができます。

于 2013-07-02T19:03:29.013 に答える