Добавить новый лист из шаблона в сырой скрипт Google и организовать в папку - PullRequest
0 голосов
/ 22 марта 2020

У меня есть эта таблица, и я хотел бы копировать шаблон в каталог для каждого месяца и добавлять ссылку в каждую соответствующую ячейку, добавляя соответствующие данные

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

Это возможно?

Спасибо

https://docs.google.com/spreadsheets/d/1abdggD73Zb0XmRoFaMx0ssULjtLLTHhFQV3ikbaEK_I/edit?usp=sharing




function newSheet() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var templateSheet = ss.getSheetByName("Plantilla")
    var sheet1 = ss.getSheetByName("Sheet1")
        var getNames = sheet1.getRange("G2:G").getValues().filter(String).toString().split(",");

    for (var i = 0; i < getNames.length; i++) {
        var copy = ss.getSheetByName(getNames[i]);
        if (copy) {
            Logger.log("Sheet already exists");
        } else {
            templateSheet.copyTo(ss).setName(getNames[i]);
            ss.setActiveSheet(ss.getSheetByName(getNames[i]));
            ss.moveActiveSheet(ss.getNumSheets());
        }
    }
}


// function to create the index
function createIndex() {

  // Get all the different sheet IDs
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();

  var namesArray = sheetNamesIds(sheets);

  var indexSheetNames = namesArray[0];
  var indexSheetIds = namesArray[1];

  // check if sheet called sheet called already exists
  // if no index sheet exists, create one
  if (ss.getSheetByName('index') == null) {

    var indexSheet = ss.insertSheet('Index',0);

  }
  // if sheet called index does exist, prompt user for a different name or option to cancel
  else {

    var indexNewName = Browser.inputBox('The name Index is already being used, please choose a different name:', 'Please choose another name', Browser.Buttons.OK_CANCEL);

    if (indexNewName != 'cancel') {
      var indexSheet = ss.insertSheet(indexNewName,0);
    }
    else {
      Browser.msgBox('No index sheet created');
    }

  }

  // add sheet title, sheet names and hyperlink formulas
  if (indexSheet) {

    printIndex(indexSheet,indexSheetNames,indexSheetIds);

  }

}



// function to update the index, assumes index is the first sheet in the workbook
function updateIndex() {

  // Get all the different sheet IDs
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var indexSheet = sheets[0];

  var namesArray = sheetNamesIds(sheets);

  var indexSheetNames = namesArray[0];
  var indexSheetIds = namesArray[1];

  printIndex(indexSheet,indexSheetNames,indexSheetIds);
}


// function to print out the index
function printIndex(sheet,names,formulas) {

  sheet.clearContents();

  sheet.getRange(1,1).setValue('Workbook Index').setFontWeight('bold');
  sheet.getRange(3,1,names.length,1).setValues(names);
  sheet.getRange(3,2,formulas.length,1).setFormulas(formulas);

}


// function to create array of sheet names and sheet ids
function sheetNamesIds(sheets) {

  var indexSheetNames = [];
  var indexSheetIds = [];

  // create array of sheet names and sheet gids
  sheets.forEach(function(sheet){
    indexSheetNames.push([sheet.getSheetName()]);
    indexSheetIds.push(['=hyperlink("#gid=' 
                        + sheet.getSheetId() 
                        + '";"' 
                        + sheet.getSheetName() 
                        + '")']);
  });

  return [indexSheetNames, indexSheetIds];

}

1 Ответ

0 голосов
/ 02 апреля 2020

Решение

С помощью службы Drive в Apps Script и Spreadsheet service вы легко сможете достичь своих намерений. Ниже приведен поясняющий комментарий фрагмент кода, который достигает того, к чему вы стремитесь.

ПРИМЕЧАНИЕ. Я только привел пример того, как это будет с первым месяцем (ENERO), чтобы достичь остального, это будет просто копирование того, что я делал с первым месяцем.

function myFunction() {
  // Get the sheet where we have all the dates
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  
  // Get the month name. Repeat this for the other months you might want to include
  // For example if February is on A10 just get the range from A10
  var Month1 = sheet.getRange('A1').getValue();
  
  // Create a parent folder in the root of your drive where you will be storing everything for this project
  var parentFolder = DriveApp.createFolder('Months');
  
  // Create a folder for each month using the name we got before. Repeat for the rest of the months.
  var Month1Folder = DriveApp.getFolderById(parentFolder.getId()).createFolder(Month1);
  
  // Get the dates of each month. Repeat for the rest of the months. 
  // For example, if February dates go from A11  to A21 get the range A11:A21
  // Also, getValues returns an array of arrays. Therefore I have flatten it to make a simple 1D array
  var Month1Days = sheet.getRange('A2:A4').getValues().flat();
  
  // For every element of our Month 1 date names array
  // Repeat this block for the rest of the months substituying the array and column (to not overwrite) accordingly 
  for(i=0;i<Month1Days.length;i++){
    
    // Create a new spreadsheet with the name of the dates of that month and get its id
    var idFile = SpreadsheetApp.create(Month1Days[i]).getId();
    
    // Get the file object of the new Spreadsheet
    var file = DriveApp.getFileById(idFile);
    
    // Add this file to our month folder
    Month1Folder.addFile(file);
    
    // Remove the duplicate that is still in the root folder
    DriveApp.getRootFolder().removeFile(file);
    
    // Paste a link to this new spreadsheet in our original sheet in the third column
    sheet.getRange(i+1, 3).setValue(file.getUrl());
  } 
  
}

Надеюсь, это помогло вам. Дайте мне знать, если вам нужно что-то еще или вы что-то не поняли. :)

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