Как можно создать несколько вкладок из диапазона, используя Google Apps Script в Google Sheet? - PullRequest
0 голосов
/ 10 ноября 2019

Мне нужно создать пользовательскую функцию для создания нескольких вкладок в Google Sheet на основе значений в столбце A. Как это сделать?

Это для отслеживания данных по определенным продуктам электронной коммерции. ,Название их в первом столбце первой вкладки. Каждая запись в столбце A должна иметь вкладку с тем же именем.

Я не знаю, как это сделать.

В результате должны появиться новые вкладки, созданные каждой ячейкой в ​​столбце A.

Ответы [ 3 ]

0 голосов
/ 10 ноября 2019

Создание нескольких листов с шаблонами и положением

  1. Откройте новую электронную таблицу и перейдите в редактор сценариев
  2. Загрузите код и сохраните его
  3. Создайте лист с именем «Данные листа»
  4. Создайте три шаблона
  5. Запустите createTrigger ()
  6. Закройте электронную таблицу
  7. Откройте электронную таблицу и дайте еенекоторое время, и он будет создавать все листы, не беспокоясь о шаблонах или листе данных листа. Код:
    function onOpen() {
      SpreadsheetApp.getUi().createMenu("My Menu")
      .addItem('Create onOpen Trigger', 'createTrigger')
      .addToUi();
    }
    //This is where the sheets get created  
    function startUp() {
      var ss=SpreadsheetApp.getActive();
      var templateA=["A","B","C"];
      templateA.forEach(function(name){ss.getSheetByName(name).hideSheet();});
      var sh=ss.getSheetByName("Sheet Data");
      var shts=ss.getSheets();
      var shtnames=shts.map(function(sh){if(!sh.isSheetHidden()){return sh.getName();}}).filter(function(e){return e});
      var hdnshts=shts.map(function(sh){if(sh.isSheetHidden()){return sh.getName();}}).filter(function(e){return e});
      var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
      var vA=rg.getValues();
      vA.sort(function(a,b){return a[2]-b[2];});
      vA.forEach(function(r){
        if(shtnames.indexOf(r[0])==-1 && r[0]!=sh.getName()) {
          ss.insertSheet(r[0], r[2], {template:ss.getSheetByName(r[1])});
        }
        shts=ss.getSheets();
        shtnames=shts.map(function(sh){if(!sh.isSheetHidden()){return sh.getName();}}).filter(function(e){return e});
      });
      var end="is near";
    }

    function isTrigger(funcName){
      var r=false;
      if(funcName){
        var allTriggers=ScriptApp.getProjectTriggers();
        for(var i=0;i<allTriggers.length;i++){
          if(funcName==allTriggers[i].getHandlerFunction()){
            r=true;
            break;
          }
        }
      }
      return r;
    }

    //Installable onOpen trigger
    //run this function first
    function createTrigger() {
      var ss=SpreadsheetApp.getActive();
      if(!isTrigger('startUp')) {//This keeps you from creating unnecessary triggers
        ScriptApp.newTrigger('startUp').forSpreadsheet(ss).onOpen().create()
      }
    }

    //This is useful for testing
    function deleteSheets() {
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getSheetByName("Sheet Data");
      var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
      var vA=rg.getValues();
      vA.forEach(function(r){
        ss.deleteSheet(ss.getSheetByName(r[0]));
      });
    }

Лист создания:

enter image description here

Три шаблона: я только что создал эти шаблоны какПростые примеры, чтобы помочь в создании ваших листов. Я считаю, что непрограммисты действительно преуспевают в этом процессе, создавая очень необычные таблицы. Для меня я держу их простыми.

enter image description here

enter image description here

enter image description here

Я попытался с помощью этого gif-файла показать, как создаются файлы при первом открытии электронной таблицы. Это не будет создавать дополнительные листы с тем же именем. Но если вы добавите дополнительные имена, он создаст их. Невозможно удалить имена листов, которые были удалены, поэтому вы можете что-то сделать для себя.

enter image description here

0 голосов
/ 11 ноября 2019

Эта функция ниже создает новый лист каждый раз, когда ячейка из столбца А на исходном листе редактируется, только если другой лист с таким именем еще не существует. Для этого используется и onEdit триггер, а также соответствующий объект события :

function onEdit(e) {
  var firstSheetName = "Sheet1"; // Name of your original sheet, change accordingly
  var range = e.range; // Edited cell
  var ss = e.source; // Edited spreadsheet
  var sheetName = range.getSheet().getName(); // Name of edited sheet
  var value = range.getValue(); // Value of the edited cell
  // Checks whether edited sheet is the original one, and edited column is A:
  if(sheetName == firstSheetName && range.getColumn() == 1) {
    // Checks whether a sheet with this name exists:
    var sheetExists = ss.getSheets().some(function(sheet) {
      return sheet.getName() == value;
    });
    // Create new sheet only if a sheet with this name it doesn't exist:
    if(!sheetExists) { 
      ss.insertSheet(value);
      range.activate(); // Go back to original edited cell
    }
  }
}
  • См. Комментарии в общем сценарии, чтобыПонять, что делает код, шаг за шагом.
  • В этом примере исходный лист называется «Лист1». Измените его соответствующим образом, если это не ваш случай.

Я надеюсь, что это поможет.

0 голосов
/ 10 ноября 2019

Скопируйте и вставьте этот код в редактор скриптов.

function createSheet(sheetIndex, value){
  // Check if cell is empty after editing
  if (value.oldValue){
    value = 'Sheet' + (sheets.length - sheetIndex);
  }

  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

  // If sheet already exits just change the sheet name
  if (sheets[sheetIndex]) {
    sheets[sheets.length - sheetIndex].setName(value)
  } else {
    SpreadsheetApp.getActiveSpreadsheet().insertSheet(value);
  }
}

function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

  // Check if the sheet being edited is the first sheet and first column (A)
  if (sheet.getSheetId() == sheets[0].getSheetId() && sheet.getActiveCell().getColumn() == 1) {
    createSheet(e.range.getRowIndex(), e.value)
  }

}

Вы можете расширить код для поддержки удаления;Это немного сложно, потому что нет события onDelete. Вы можете сравнить массив листов со значениями в столбце, чтобы определить, какой лист удалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...