Создайте новый лист с названием, основанным на следующем месяце

У меня есть сценарий, который создает новый лист с именем на основе месяца-года, например, октябрь-2017, автоматически каждый новый месяц.

Но теперь я хотел бы иметь кнопку, с помощью которой я могу создавать новые листы с той же структурой, с именами, основанными на MMM-yyyy.

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

Итак, если раньше имя листа было основано на следующем коде,

function checkSheetName() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = formatDate(); // load the current 'Month-Year'

  try {
    ss.setActiveSheet(ss.getSheetByName(sheetName)); // try to set 'sheetName' as active sheet
  } catch (e) { // if returns error,
    createNewMonthSheet(); // creates a new sheet
  }

function createNewMonthSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = formatDate(); // load the current 'Month-Year'  
  ss.insertSheet(sheetName, 2); // creates a new sheet on the left side, after 2 existing sheets
}

function formatDate() {
  var monthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
  var monthNumber = Utilities.formatDate(new Date(), 'GMT+12:00', "M");
  var yearNumber = Utilities.formatDate(new Date(), 'GMT+12:00', "yyyy");
  return monthNames[monthNumber-1]+'-'+yearNumber; 
}

теперь код должен использовать имя листа в качестве ссылки для нового имени, увеличивая дату и соблюдая реальный календарь, поэтому, если текущее имя листа - декабрь 2017 г., кнопка создаст новый лист с именем января-2018. Так что больше нет необходимости иметь отношение к новой команде Date, как мой предыдущий код.

Я начал новый код, но не знаю, как создать var nameOfNextMonth:

function createNewSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var currentMonth = ss.getActiveSheet().getName();
  var nameOfNextMonth = **[currentMonth+1]**;
  ss.setActiveSheet(ss.getSheetByName("template"));
  var newSheet = ss.duplicateActiveSheet();
  newSheet.activate();
  ss.moveActiveSheet(0);
  newSheet.setName(nameOfNextMonth);
}

В этом есть какой-то смысл? Может ли кто-нибудь дать мне представление, как действовать дальше?


person Daniel Sian    schedule 04.10.2017    source источник


Ответы (2)


Вы можете получить название следующего месяца, используя стандартный _1 _, он будет обрабатывать приращение до соответствующего года и переход к соответствующему месяцу.

Кроме того, не забудьте проверить, существует ли уже лист с таким именем.

function createWorksheet()
{
  var monthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  var monthsToAdd = 1;
  var currentDate = new Date();
  currentDate.setMonth(currentDate.getMonth() + monthsToAdd);

  var sheetName = monthNames[currentDate.getMonth()]+"-"+currentDate.getFullYear();
  var sheetsArray = spreadsheet.getSheets();
  var creationFlag = false;
  //Logger.log(sheetsArray)
  for(var itr in sheetsArray)
  {
    if(sheetsArray[itr].getSheetName() == sheetName)
    {
      creationFlag = false;
      break;
    }
    else
      creationFlag = true;
  }

  if(creationFlag)
    spreadsheet.insertSheet(sheetName);

  if(!creationFlag)
    Logger.log("Worksheet Exists");
}//createWorksheet
person Parag Jadhav    schedule 04.10.2017
comment
@DanielSian Рад помочь :) Пожалуйста, примите это как ответ, если он работает для вас. - person Parag Jadhav; 07.10.2017
comment
Как я могу это сделать? - person Daniel Sian; 08.10.2017

Я не включил обработку ошибок (поэтому убедитесь, что у активного листа есть имя в формате ммм-гггг), но посмотрите, работает ли это

function createNewSheet() {
var monthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
var ss = SpreadsheetApp.getActiveSpreadsheet();
var curMonth = ss.getActiveSheet().getName().split("-")
var nextMonth = new Date(curMonth[1], monthNames.indexOf(curMonth[0])+1, 1);
var name = Utilities.formatDate(nextMonth, 'GMT+12:00', "MMM-yyyy")
ss.setActiveSheet(ss.getSheetByName("template"));
if(!ss.getSheetByName(name)){    
ss.duplicateActiveSheet().activate().setName(name)
ss.moveActiveSheet(0);
}
}
person JPV    schedule 04.10.2017
comment
он создает лист под названием «Янв-1970», затем «Фев-1970», «Март-1970» ... В любом случае, спасибо за вашу помощь. - person Daniel Sian; 06.10.2017
comment
У меня отлично работает. Я буду рад изучить его, если вы поделитесь копией своей таблицы. - person JPV; 06.10.2017
comment
Конечно! Вот таблица: - person Daniel Sian; 07.10.2017
comment
У меня отлично работает. Важно убедиться, что активный лист имеет имя в формате MMM-yyyy. Затем сценарий обработает эту дату и добавит месяц. Я изменил название вкладки на «Янв-2017», запустил скрипт, и февраль-2017 был создан. - person JPV; 07.10.2017