1

VMergeが行うことを実行するが、テーブルのフォーマットを一緒にマージし続けるGoogle Apps Scriptがあるかどうか誰かが知っていますか?(Googleスプレッドシート内)

VMergeは、カスタム数式として使用できるスクリプトですが、自分でトリガーできるスクリプトでも問題ありません。

どんな助けでも大歓迎です。

4

3 に答える 3

2

VMerge は値の配列をパラメーターとして想定しているため、これらの配列を作成するためにどのセルが参照されたかはわかりません。カスタム式として使用すると、シート パーサーは VMerge に渡す前にすべての範囲パラメーターを値に解決します。さらに、パラメーターはハードコードされているか、範囲を返すクエリまたはその他の関数の結果である場合があります。これだけでは、VMerge を変更してセル形式を新しい結合テーブルにコピーすることはできません。

さらに複雑なことに、カスタム関数は、関連付けられているセル以外のセルを変更することはできず、値または値の配列のみを返すことができます。Issue 37のコメントから:

2) セル関数として使用されるスクリプトは、他の API への接続や他のセルの値の設定などの複雑なことを行うことはできません。セル関数として使用されるスクリプトは、値を返すことのみが許可されています。

したがって、スクリプトから呼び出す関数に落ち着く必要があります。次の関数は、指定されたアンカー ポイントで複数の範囲を新しいテーブルに結合します。これをシートから呼び出し可能なカスタム関数にしようと始めたので、パラメーターは a1Notation の範囲の文字列式です。(Range オブジェクトを直接処理するように簡単にリファクタリングできます。)

新しい範囲の「アンカー」はセルであると予想されます。任意のサイズの 1 つまたは複数の範囲を結合できます。それぞれの範囲は、直前の範囲のすぐ下に配置されます。

例:

  • VJoin("D1","A1:B");- 列 A と列 B のすべてが列 D と列 E に複製されました
  • VJoin("Sheet2!A1","Sheet1!C9:E10","Sheet1!A14:B15");- シート 1 の 2 つの異なる範囲が結合され、シート 2 にコピーされました。

コードは次のとおりです。

/*
 * Vertically join the ranges from multiple sources into a new table
 * starting at the given anchor point. Values and formatting are copied.
 *
 * @param {a1Notation} anchorA1 Anchor for joined table.
 * @param {a1Notation} sources One or more source ranges.
*/
function VJoin(anchorA1,sources) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var anchor = sheet.getRange(anchorA1);
  var anchorSheet = anchor.getSheet();  // in case anchorA1 is not on the "active sheet"
  var nextAnchor = anchor;

  for (var i in arguments) {
    // Arguments are expected to be Strings, containing a1Notation.
    if (i == 0) continue; // First argument was anchorA1, skip it.
    if (arguments[i].constructor == String) {
      var source = sheet.getRange(arguments[i]);
      var destination = anchorSheet.getRange(nextAnchor.getRow(), nextAnchor.getColumn(),
                                       source.getNumRows(), source.getNumColumns() );
      // Copy all values & formatting to new location.
      source.copyTo(destination);
      // Prepare for next range by moving our anchor
      nextAnchor = sheet.getRange(nextAnchor.getRow() + source.getNumRows(), 
                                  nextAnchor.getColumn());
    }
    else {
      throw new Error ("Expected String containing a1Notation.")
    }
  }
}
于 2013-03-27T15:30:35.457 に答える
1

フォーマットを引き継ぐために別のスクリプトが必要な場合...

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Sheet1');
  s.getRange('A1').copyFormatToRange(sheet, column, columnEnd, row, rowEnd);
}
于 2013-01-19T05:19:21.627 に答える