繁体   English   中英

添加行时合并列的相同值的 Google 表格脚本

[英]Google Sheets script to merge identical values of a column when a row is added

我管理一个表,我有一个相当于帐户报表的选项卡。

我使用了一个脚本,它允许我在手动执行的列中合并所有具有相同值的单元格。

在按日期(B)排序的表 B28:N 中,其范围 B28:M 是通过使用 QUERY 的多个导入填充的,B 列包含操作日期,N 列取该列日期的月份和年份B 在 N27 中使用 ARRAYFORMULA 中的公式。 这里是:

={"Période / Mois";ARRAYFORMULA(SI($B$26:$B<>"";TEXTE($B26:$B;"mmm")&CAR(10)&TEXTE($B$26:$B;"yyy");""))}

我的问题是,当 M 列中的单元格正确合并并添加一行并运行脚本时,合并是以一种奇怪的方式完成的。

我希望在添加新行时自动取消合并,再次合并并重新格式化水平线。

这是我的工作表(“BANQUE”选项卡上的问题)

这是我的脚本:

function myFunction() {
  var start = 28; // Start row number for values.
  var c = {};
  var k = "";
  var offset = 0;
  var ss = SpreadsheetApp.getActiveSheet();
  var getSheetByName = "BANQUE";

  // Retrieve values of column B.
  var data = ss.getRange(start, 14, ss.getLastRow(), 1).getValues().filter(String);

  // Retrieve the number of duplication values.
  data.forEach(function(e){c[e[0]] = c[e[0]] ? c[e[0]] + 1 : 1;});

  // Merge cells.
  data.forEach(function(e){
    if (k != e[0]) {
      ss.getRange(start + offset, 14, c[e[0]], 1).merge();
      offset += c[e[0]];
    }
    k = e[0];
  });
}

提前致谢。

使用条件格式(有很多优点:数据库仍然完全可用,您可以查询、排序……)

奇数月,第一次出现

=and(N28<>N27;mod(month($B28);2))

偶数月,第一次出现

=and(N28<>N27;mod(month($B28);2))

奇数月(背景颜色和字体颜色相同)

=mod(month($B28);2)

偶数月(背景颜色和字体颜色相同)

=mod(month($B28)+1;2)

假设每月至少有一件物品

在此处输入图像描述

可以将文本居中(+/- 一行),但要复杂得多

按脚本

function mergeCells() {
  const columns = [14]; // These column number is the column "N"
  const sheetName = "BANQUE";  // Please set the sheetname.
  const firstRow = 28
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const rng = sheet.getRange(firstRow, columns, sheet.getLastRow() - firstRow, 1)
  rng.getMergedRanges().forEach(m => m.breakApart())
  const data = rng.getValues().flat()
  let toThere = data.length - 1
  let fromHere = 0
  for (var i = data.length - 1; i > 0; i--) {
    if (data[i] != data[i - 1]) {
      sheet.getRange(firstRow + i, columns, toThere - i + 1, 1).activate().merge()
      toThere = i - 1
    }
  }
  i = 0
  sheet.getRange(firstRow + i, columns, toThere - i + 1, 1).activate().merge()
}

对于自动化,请在当前 onEdt(e) function 开头添加此代码

  let sh = e.source.getActiveSheet()
  let onglets = ['PAIEMENTS', 'ENCAUSSEMENTS', 'IMPORTS']
  if (onglets.indexOf(sh.getName()!=-1)){
    mergeCells()
  }

这是取消合并、合并和添加水平线的脚本。

我还没有找到自动化的方法,所以我添加了 onOpen() function。

function onOpen() {
  SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
    .addItem('👉 Période / Mois Banque', 'mergeBanque')
    .addToUi();
  mergeBanque()
}

function mergeBanque() {
  var start = 28; // Start row number for values.
  var c = {};
  var k = "";
  var offset = 0;
  var ss = SpreadsheetApp.getActiveSheet();
  var getSheetByName = "BANQUE"; // Please set the sheetname

  // unmerge column B. Add horizontal SOLID borders column B. Retrieve values of column B.
  var data = ss.getRange(start, 14, ss.getLastRow(), 1)
  .breakApart()
  .setBorder(null, null, null, null, null, true, 'black', SpreadsheetApp.BorderStyle.SOLID).getValues()
  .filter(String);

  // Retrieve the number of duplication values.
  data.forEach(function(e){c[e[0]] = c[e[0]] ? c[e[0]] + 1 : 1;});

  // Merge cells.
  data.forEach(function(e){
    if (k != e[0]) {
      ss.getRange(start + offset, 14, c[e[0]], 1).merge(); // column to be merged "14"
      offset += c[e[0]];
    }
    k = e[0];
  });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM