[英]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 列中的单元格正确合并并添加一行并运行脚本时,合并是以一种奇怪的方式完成的。
我希望在添加新行时自动取消合并,再次合并并重新格式化水平线。
这是我的脚本:
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];
});
}
提前致谢。
按脚本
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.