【问题标题】:How to automatically merge cells in Google Sheets upon creation of new Sheet创建新表格后如何自动合并Google表格中的单元格
【发布时间】:2020-07-10 23:19:50
【问题描述】:

我正在尝试找出一种方法,让 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-script google-sheets


【解决方案1】:

问题是onChange 触发器无法正确检测到活动工作表

在触发器上检索活动工作表将始终为您返回第一个工作表,因为您可以轻松验证

function myFunction(e) {
  Logger.log(e.changeType);
  if(e.changeType=="INSERT_GRID"){
    Logger.log(SpreadsheetApp.getActive().getActiveSheet().getName());
  } 
}

因此您需要实施解决方法。

例如:

  • 将当前工作表名称写入Script properties
  • 当触发器触发并且条件e.changeType=="INSERT_GRID" 被满足时: 将当前存在的工作表编号与脚本属性中存储的编号进行比较,以评估是否插入了新工作表
  • 如果工作表编号增加 - 使用indexOf() 查找新工作表的名称
  • 合并新工作表上的单元格并更新脚本属性

代码sn-p:

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;
        }
      }    
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多