16

Googleドキュメントスプレッドシート。セルA1とA2がマージされている場合、Google Appsスクリプトを使用してそれらがマージされていることを確認する方法はありますか?

GASにはマージ機能がありますhttps://developers.google.com/apps-script/class_range#merge

ただし、セルが結合されているかどうかを確認する方法を示す関数や例はありません。

getValuesなどは、セルの空の文字列を返すだけです。たとえば、これは機能しません。

function testMerge() {

  var spreadsheet = SpreadsheetApp.openById('Z3ppTjxNUE........'); 
  var sheet = spreadsheet.getSheets()[0];
  var range = sheet.getRange("A3:A4");
  var values = range.getValues();
  var formulas = range.getFormulasR1C1();
  var formulasA1 = range.getFormulas();

  range = sheet.getRange("A4");
  range.setValue("a");

  range = sheet.getRange("A3:A4");
  var values2 = range.getValues();
  var formulas2 = range.getFormulasR1C1();
  var formulasA12 = range.getFormulas();


  var count = range.getHeight();


}
4

9 に答える 9

11

はい、これisPartOfMergeでチェックに使用できます。

そして、結合されたセルの値を取得したい人のために:

var value = (cell.isPartOfMerge() ? cell.getMergedRanges()[0].getCell(1,1) : cell).getValue();

それが役立つことを願っています。

于 2019-01-14T07:50:36.347 に答える
7

range.isPartOfMerge()

.isPartOfMerge()メソッドが実装されたようです(2016年9月11日)。

したがって、範囲がそのようにマージされているかどうかを確認できます。

function testMerge() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Sheet1");
  var range = sheet.getRange(1,1,2); // example for cells A1 and A2
  Logger.log(range.isPartOfMerge());
}

ドキュメント https://developers.google.com/apps-script/reference/spreadsheet/range#ispartofmerge


古いアプローチ

受け入れられた回答よりも好きな別のアプローチをここに投稿します。

GAS を使用して結合範囲のセルに値を格納しようとすると、最初のセルを除いて格納されません。

そのため、これを悪用して、次のような関数を使用して値を保存し、保存されたかどうかを確認することができます。

  function isMerged(range){
  try {
    range.getDataSourceUrl()
  } catch (err) {
    throw "isMerged function only works with valid GAS Range objects"
  }
  var sheet = range.getSheet();
  var rangeData = range.getValues();

  var testValue = "testing merge";

  if (rangeData.length == 1 && rangeData[0].length == 1) return false; // we have a single cell. Can't possible be merged :)

  if (rangeData.length == 1) {
    // We have a single row. Which means we're testing a row with multiple columns
    var mainCell=range.getA1Notation().split(":")[0];
    var rowNumber= sheet.getRange(mainCell).getRow();
    var nextColNumber = sheet.getRange(mainCell).getColumn()+1;
    var row = rangeData[0];
    var oldValue = row[1]; // for testing purposes, we're chosing the next possible column

    sheet.getRange(rowNumber,nextColNumber).setValue(testValue);
    if (sheet.getRange(rowNumber,nextColNumber).getValue() !== testValue) {
      return true;
    } else {
      sheet.getRange(rowNumber,nextColNumber).setValue(oldValue);
      return false;
    };
  } else if (rangeData[0].length == 1) {
    // We have multiple rows and a single column.
    var mainCell=range.getA1Notation().split(":")[0];
    var nextRowNumber= sheet.getRange(mainCell).getRow()+1;
    var colNumber = sheet.getRange(mainCell).getColumn();
    var oldValue = rangeData[1][0]; // for testing purposes, we're chosing the next possible row

    sheet.getRange(nextRowNumber,colNumber).setValue(testValue);
    if (sheet.getRange(nextRowNumber,colNumber).getValue() !== testValue) {
      return true;
    } else {
      sheet.getRange(nextRowNumber,colNumber).setValue(oldValue);
      return false;
    };
  } else {
    // We have multiple rows and multiple columns
    var mainCell=range.getA1Notation().split(":")[0];
    var nextRowNumber= sheet.getRange(mainCell).getRow()+1;
    var nextColNumber = sheet.getRange(mainCell).getColumn()+1;
    var oldValue = rangeData[1][1]; // for testing purposes, we're chosing the next possible row and next possible column

    sheet.getRange(nextRowNumber,nextColNumber).setValue(testValue);
    if (sheet.getRange(nextRowNumber,nextColNumber).getValue() !== testValue) {
      return true;
    } else {
      sheet.getRange(nextRowNumber,nextColNumber).setValue(oldValue);
      return false;
    };
  }

  // if none of these checks worked, something's fishy. Either way, return false
  return false
}

一連の簡単なテストを実行したところ、それに応じてtrue/が返さfalseれましたが、カバーする時間がなかったという制限があり"A1:F1"ます"A1:G1"。 G1 がマージされた範囲の一部でなくても、を返しtrueます。これは、最初にバインドされた行/列を参照として使用して次の列のみをチェックするためです。

于 2015-10-08T14:14:18.273 に答える
2

それを知ることはできません。これに関してはすでに問題が発生していますが、かなり古く、活動がありません。(更新と投票の種類を追跡するために)スターを付け、コメントを残して、注意を引くことができるかどうかを確認する必要があります。

しかし、マージされたセルを保証する必要があるときに私が行うことは、念のために、すべてを分解して再度マージすることです。もちろん、これは解決策ではなく、あなたにも合うかもしれないアイデアです。

于 2012-06-14T04:14:59.163 に答える
1

結合されたセルが常に白い背景を返すという事実を利用した回避策があるようです。以下のコードは私にとってはうまくいくようです。どなたか確認していただけると助かります。

function testMerged() {
  var WHITE = '#ffffff';
  var NON_WHITE = '#fffffe';
  var range = SpreadsheetApp.getActiveSheet().getDataRange();
  range.setBackground(NON_WHITE);
  range.getBackgrounds().forEach(function (row, rowNum) {
    row.forEach(function (col, colNum) {
      if (col === WHITE) { Logger.log('Cell merged at row ' + rowNum + ' col ' + colNum); }
    });
  });
  range.setBackground(WHITE);  
}
于 2015-03-25T08:49:35.283 に答える
0

HTMLとしてダウンロード:シートをHTMLとしてダウンロードできます。これには、結合されたセル情報が含まれます。良い解決策ではありませんが、機能します。

ダウンロードURLの例:

docs.google.com/feeds/download/spreadsheets/Export?key=* Spreadsheetkey *& exportFor‌ mat = html&gid = 3

ここで、gidはシートのgid番号です。-GoogleドライブAPIを介してサインインする必要があります(詳細については、GoogleドライブのDrEditチュートリアルを参照してください)

于 2013-03-05T02:59:26.657 に答える
0

ここに投稿されたこのソリューションを見つけました:
https://code.google.com/p/google-apps-script-issues/issues/detail?id=618

ただし、アクティブレンジでのみ機能します

// This is my function to test the active range is merged or not and return
// true or false by passing active range to it
function ismerge() {
  var spread = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spread.getActiveSheet();
  var last_row = sheet.getActiveRange().getLastRow();
  var last_col = sheet.getActiveRange().getLastColumn();

  Logger.log("Last row: %s", last_row);
  var active_row = sheet.getActiveRange().getRow();
  var active_col = sheet.getActiveRange().getColumn();
  Logger.log("Row: %s", active_row);
  if ( (last_row == active_row) && (last_col == active_col) ) {
    Logger.log("Cell not merged");
    return false;
  }
  else {
    Logger.log("Cell merged");
    return true;
  }
}
于 2013-06-03T07:43:44.497 に答える
0

Googleスプレッドシートの新しいバージョンではこの問題が見られなかったので、少し遅い答えかもしれません。しかし、私はまだ自分のプロジェクトに古いバージョンのスプレッドシートを使用しています。だから私はどういうわけかそれを理解する必要がありました。

新しい列の前の列の形式をコピーする必要があります。これは以下のコードの一部です。

      // trying to find first column with week day (white background)
      var background = '';
      for(var columnIndex = 3; columnIndex<=columnLetters.length; columnIndex++){
        background = sheet.getRange(1, columnIndex).getBackground();
        if(background == 'white' || background == ''){
          tmpRange = columnLetters[columnIndex]+':'+columnLetters[columnIndex];
          Logger.log('tmpRange: '+tmpRange);
          // workaround to be able to copy format if there is some merged cells
          try{
            Logger.log('try');
            // copy format of previous column
            sheet.getRange(tmpRange).copyTo(
              sheet.getRange('B1'), {formatOnly:true}
            );
          }catch(e) {
            Logger.log('continue');
            continue;
          }
          Logger.log('break');
          break;
        }
      }

したがって、ここで最も重要な部分は次のとおりです。

try{
  Logger.log('try');
  // copy format of previous column
  sheet.getRange(tmpRange).copyTo(
    sheet.getRange('B1'), {formatOnly:true}
  );
}catch(e) {
  Logger.log('continue');
  continue;
}

それらのセルをコピーできない場合は、他のセルを検索し続けます。

于 2015-04-07T08:44:33.273 に答える