【问题标题】:Create a new sheet with a name based on the next month根据下个月创建名称的新工作表
【发布时间】:2017-10-04 03:44:43
【问题描述】:

我有一个脚本,它会创建一个新的工作表,其名称基于月份年份,例如 Oct-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 年 12 月,按钮将创建一个名为 Jan- 的新工作表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);
}

这有意义吗? 谁能告诉我如何进行?

【问题讨论】:

    标签: javascript google-sheets google-sheets-api


    【解决方案1】:

    您可以使用标准 new Date() 获取下个月的名称,它将处理递增到适当的年份并修改到适当的月份。

    另外,请确保检查该名称的工作表是否已经存在

    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
    

    【讨论】:

    • @DanielSian 很高兴为您提供帮助 :) 如果它对您有用,请接受它作为答案。
    • 我该怎么做?
    【解决方案2】:

    我没有包含任何错误处理(因此请确保活动工作表具有格式为 mmm-yyyy 的名称),但看看这是否有效

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

    【讨论】:

    • 它会创建一个名为 Jan-1970, than, Feb-1970, Mar-1970 ... 不管怎样,谢谢你的帮助。
    • 对我来说很好。如果您可以分享您的电子表格副本,我会很高兴调查一下。
    • 当然!这是电子表格:docs.google.com/spreadsheets/d/… 谢谢
    • 很适合我。重要的是确保活动工作表具有 MMM-yyyy 格式的名称。然后脚本处理该日期并添加一个月。我将选项卡名称更改为 Jan-2017,运行脚本并创建了 Feb-2017。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2015-08-06
    • 1970-01-01
    • 2019-02-03
    • 2016-02-12
    • 1970-01-01
    相关资源
    最近更新 更多