google-apps-script - 如何在创建新工作表时自动合并 Google 表格中的单元格
问题描述
我试图找出一种方法,让 Google 表格在创建新表格时自动合并单元格 A1-C1。我和我的同事一直在试图找出可以实现这一点的脚本,但我们尝试的一切都只改变了我们正在处理的上一个工作表,而不是新的工作表。
到目前为止,这是我们尝试过的两个脚本,只是为了获得我们正在寻找的某种结果:
function formatCells() {
var ss = SpreadsheetApp.getActiveSpreadsheet ();
var s = ss.getSheetByName('Combined')
var range = s.getDataRange()
var values = range.getValues();
for( var row = values.length -1; row >= 0; --row)
if (values[row][1] == 'Hello')
{s.getRange(row+1,1).mergeAcross();
}
}
和
function newSheetTrigger() {
var ss = SpreadsheetApp.getActive();
ScriptApp.newTrigger('newSheet')
.forSpreadsheet(ss)
.onChange()
.create();
}
function newSheet(e){
if (e.changeType == 'INSERT_GRID') {
SpreadsheetApp.flush();
SpreadsheetApp.getActiveSheet().getRange('A1:C1').merge();
}
}
有谁知道我们哪里出错了?
解决方案
问题是onChange
触发器无法正确检测到活动工作表
在触发器上检索活动工作表将始终返回您的第一张工作表,因为您可以轻松验证
function myFunction(e) {
Logger.log(e.changeType);
if(e.changeType=="INSERT_GRID"){
Logger.log(SpreadsheetApp.getActive().getActiveSheet().getName());
}
}
因此,您需要实施一种解决方法。
例如:
- 在脚本属性中存储当前工作表名称
- 当触发器触发并满足条件时
e.changeType=="INSERT_GRID"
:将当前存在的工作表编号与脚本属性中存储的工作表编号进行比较,以评估是否插入了新工作表 - 如果工作表编号增加 - 使用indexOf()查找新工作表的名称
- 合并新工作表上的单元格并更新脚本属性
代码片段:
var ss = SpreadsheetApp.getActive();
//run me once
function firstSetUp(){
var sheets = ss.getSheets();
var names = [];
for (var i = 0; i < sheets.length; i++){
names.push(sheets[i].getName())
}
PropertiesService.getScriptProperties().setProperty("sheets", JSON.stringify(names) );
}
//run me on trigger
function newSheet(e) {
if(e.changeType=="INSERT_GRID"){
var newSheets = ss.getSheets();
var oldSheetNames = JSON.parse(PropertiesService.getScriptProperties().getProperty("sheets"));
Logger.log(oldSheetNames);
var length = oldSheetNames.length;
Logger.log("length : " + length);
if (length != newSheets.length){
for (var i = 0; i < newSheets.length; i++){
if(oldSheetNames.indexOf(newSheets[i].getName()) == -1){
var newSheet = newSheets[i];
Logger.log(newSheet.getName());
newSheet.getRange('A1:C1').merge();
oldSheetNames.push(newSheet.getName());
PropertiesService.getScriptProperties().setProperty("sheets", JSON.stringify(oldSheetNames));
break;
}
}
}
}
}
推荐阅读
- javascript - 如何将变量从php页面发送到另一个页面
- asp.net - Blazor 默认角色提供程序
- python - 有没有办法在 Pandas 中显示 24 小时以上的时间数据?
- c# - 如何在 xaml 中调整大小后获取新窗口高度
- java - 如何保存和加载包含另一个类列表的类?
- javascript - 我需要使用链接文本作为 aria 标签将 aria-label 添加到网站上的所有链接
- jquery - 数据表 Dom 定位引导程序
- c++ - 在使用 std::unique_ptr 在退出作用域块时自动释放内存的情况下,为什么不直接使用堆栈呢?
- checkbox - Semantic-ui 预设复选框状态
- mongodb - 猫鼬 在短语中查找确切的单词