【问题标题】:Get A1Notation of rectangle areas on spreadsheet获取电子表格上矩形区域的 A1Notation
【发布时间】:2018-10-17 23:13:07
【问题描述】:

我想获得电子表格上矩形区域的 A1Notation。电子表格上的矩形示例如下图。

我想获得值为“1”的单元格的 A1Notation。我不想得到“B2、C2、D2、B3、C3、D3、B4、C4、D4”。我想得到“B2:D4”。我尝试过的脚本是

var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var result = [];
for (var i = 0; i < data.length; i++){
  for (var j = 0; j < data[i].length; j++){
    if (data[i][j] == 1) {
      var range = sheet.getRange(i + 1, j + 1).getA1Notation();
      result.push(range);
    }
  }
}
Logger.log(result);

此脚本返回“B2、C2、D2、B3、C3、D3、B4、C4、D4”。 sheet.getDataRange().getA1Notation() 是“A1:D4”。 “1”的单元格的位置并不总是相同的。我的问题是

  • 当“1”的单元格的位置形成一个矩形区域时,有没有办法将矩形区域检索为A1Notation?
    • 在示例中,我想从电子表格或“B2、C2、D2、B3、C3、D3、B4、C4、D4”中获取“B2:D4”。

我检查了Puzzle: Find largest rectangle (maximal rectangle problem) 和链接。但我无法理解将其应用于我的脚本的方式。非常感谢您的宝贵时间。

编辑

这些是样本。我按大小顺序获取区域。

   A B C D E

1  0 0 0 0 0
2  0 1 1 1 0
3  0 1 1 1 0
4  0 1 1 1 0
5  0 0 0 0 0

我需要“B2:D4”。

   A B C D E

1  1 1 1 0 0
2  0 1 1 1 0
3  0 1 1 1 0
4  0 1 1 1 0
5  0 0 0 0 0

我需要“B2:D4”和“A1:C1”。

   A B C D E

1  0 1 1 1 1
2  0 1 1 1 1
3  0 0 0 1 1
4  0 0 0 0 1
5  0 0 0 0 1

我需要“B1:E2”、“E3:E5”、“D3:D3”。

【问题讨论】:

  • 没有简单的方法。如果您可以确定表格的边缘没有间隙,您可以使用Range#getNextDataCell() 帮助找到边界边缘,但您仍然需要实现自己的逻辑来存储相关的单元格索引并从中构造 A1 字符串.
  • @tehhowch 是的。我想是这样。但我仍然找不到更新脚本的算法。
  • 请将comment上的说明添加到this answer并相应地编辑标题。
  • @I'-'我很抱歉让您感到困惑。我更新了我的答案。如果您看不清楚,请告诉我。
  • @Rubén 很抱歉让您感到困惑。我更新了我的答案。如果您看不清楚,请告诉我。

标签: algorithm google-apps-script google-sheets


【解决方案1】:

您可以按如下方式修改您的功能:

var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var result = [];
for (var i = 0; i < data.length; i++){
  for (var j = 0; j < data[i].length; j++){
    if (data[i][j] == 1) {
      var range = sheet.getRange(i + 1, j + 1).getA1Notation();
      result.push(range);
    }
  }
}
Logger.log(result[0] + ":" + result[result.length-1]);

也许它没有优化,因为您正在迭代整个数据范围,但是在不了解您的数据结构的情况下很难说出优化的方式,需要详细信息。

【讨论】:

  • 这很好 --- 对于单个表。如果B2:D4 中有一个表,G1:J3 中有另一个表,则您的输出将为G1:D4
  • 这就是为什么我提到it's hard to tell what the optimized way without knowing your data structure
  • @Umair 谢谢你的回答。对不起。你误解了我的问题。 “1”的单元格位置并不总是相同。 当“B2、C2、D2、B3、C3、D3、B4、C4、D4”和“A1、B1、C1”有“ 1”,您的答案返回“A1:D4”。但这不是一个矩形区域。例如,当“A1、B1、C1、B2、C2、D2、B3、C3、D3、B4、C4、D4”为“1”时,您能否更新答案以获得矩形区域并获得“B2:D4” ?
  • 当“B2、C2、D2、B3、C3、D3、B4、C4、D4”和“A1、B1、C1”时,答案应该是2个区域:“A1:C1”和“B2:D4”,或 3 个区域“A1”、“B1:C4”、“D2:D4”。@Elsa,我不清楚你的 Q。
  • 是的@MaxMakhrov 你是对的,这就是我无法更新答案的原因。 :)
猜你喜欢
  • 2014-04-25
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多