我如何知道是否使用谷歌应用程序脚本合并电子表格单元格

edd*_*son 9 google-sheets google-apps-script

在Google文档电子表格中.如果单元格A1和A2合并,有没有办法确认它们是合并的,使用谷歌应用程序脚本?

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();


}
Run Code Online (Sandbox Code Playgroud)

Ade*_*lin 6

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());
}
Run Code Online (Sandbox Code Playgroud)

文档 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
}
Run Code Online (Sandbox Code Playgroud)

我已经运行了一系列快速测试并相应地返回了true/ false,但是有一个我没有时间涵盖的限制:如果您有一个合并范围,"A1:F1"并且您检查了该范围"A1:G1"(因此,再增加一列),true即使 G1 不是合并范围的一部分,它也会返回- 因为它只检查下一列使用第一个绑定行/列作为参考。


eri*_*ong 5

是的,现在你可以isPartOfMerge用来检查了。

对于任何想要获得合并单元格值的人:

var value = (cell.isPartOfMerge() ? cell.getMergedRanges()[0].getCell(1,1) : cell).getValue();
Run Code Online (Sandbox Code Playgroud)

希望有帮助。