Как автоматически объединить ячейки в Google Sheets при создании нового листа - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь найти способ заставить 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();
   }
   }

Кто-нибудь знает, где мы пошло не так?

1 Ответ

1 голос
/ 10 июля 2020

Проблема в том, что триггер 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;
        }
      }    
    }
  }
}

...