首页 > 解决方案 > 如何在创建新工作表时自动合并 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();
   }
   }

有谁知道我们哪里出错了?

标签: google-apps-scriptgoogle-sheets

解决方案


问题是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;
        }
      }    
    }
  }
}


推荐阅读