【问题标题】:Google Sheets Script to Duplicate & Rename Spreadsheets用于复制和重命名电子表格的 Google 表格脚本
【发布时间】:2019-11-16 13:12:06
【问题描述】:

我正在 Google 表格中创建一个脚本,该脚本将复制活动工作表并在同一工作簿中创建 30 个重复工作表。每个重复的工作表将根据活动工作表上单元格中的值具有不同的名称。该单元格将包含一个日期;重复的工作表将具有单元格中列出的日期之后的日期名称。例如,单元格 B3 是“7/5/2019”。复制的工作表应命名为“2019 年 7 月 6 日”(B3+1)、“2019 年 7 月 7 日”(B3+2)和“2019 年 7 月 8 日”(B3+3)等。

我正在使用已嵌入 Google 表格的代码。其中一些是通过录制宏创建的,而其他部分是通过我对在线编码和研究知之甚少的知识创建的。

function duplicatesheet(){

//copy active sheet
var as = SpreadsheetApp.getActiveSpreadsheet()
SpreadsheetApp.getActiveSpreadsheet().duplicateActiveSheet();

//rename sheet
var myValue = 
SpreadsheetApp.getActiveSpreadsheet().getRange('B3').getValue();
SpreadsheetApp.getActiveSpreadsheet().renameActiveSheet(myValue);

}

该代码可以将活动工作表复制一次,但不会复制 30 次。它也没有根据单元格 B3 中列出的日期正确地重命名工作表。我需要帮助创建可以完成这两项任务的代码。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    这是编辑w.r.t。厘米。您还可以看到 Tedinoz 的出色回答。

    试试这个代码:

    function duplicatesheet() {
      var as = SpreadsheetApp.getActiveSpreadsheet(); // active spreadsheet
      var s = as.getActiveSheet(); // first sheet object
      var dateCell = "B3"; // cell containing first date
      var N = 30; // number of copies to make
    
      var startDate = new Date(s.getRange(dateCell).getValue()); // get the date stored in dateCell
      var day = startDate.getDate(); // extract the day
      var month = startDate.getMonth(); // extract the month
      var year = startDate.getFullYear(); // extract the year
    
      // loop over N times
      for (var i = 0; i < N; i++) {
        var asn = s.copyTo(as); // make a duplicate of the first sheet
        var thisSheetDate = new Date(year, month, day+(i+1)); // store the new date as a variable temporarily
    
        asn.getRange(dateCell).setValue(thisSheetDate); // writes the date in cell "B3"
        asn.setName(Utilities.formatDate(thisSheetDate, undefined, "MMMMM d, yyyy")); // sets the name of the new sheet
      }
    }
    

    我建议将N=30 放在那里,例如N=2,看看它是否适用于您的格式。

    Utilities.formatDate() 方法这里使用的格式,我假设它是MMMMM d, yyyy,它将以这种格式打印选项卡名称:

    2019 年 7 月 6 日

    您可以根据下面的参考 [3] 随意更改。


    您可以在此处查看所有使用的函数的参考:

    【讨论】:

    • 嘿詹姆斯。我明天要试试这个,因为我还在旅行。我确实想指出我在单元格 B3 中只列出了 (1) 个初始日期。单元格 B4 到 B33 中没有日期列表。复制的工作表应根据 B3 中的日期值将日期加 1。感谢您的帮助!
    • 我现在已经编辑了答案。很抱歉造成混乱。
    • James - 此代码有效。谢谢!抱歉,我在最初的询问中遗漏了一件事。单元格 B3 也需要使用每个重复工作表上的新日期进行更新。示例 - 在名为 2019 年 7 月 6 日的重复工作表上,单元格 B3 应为“2019 年 7 月 6 日”。在下一张名为 2019 年 7 月 7 日的重复工作表上,单元格 B3 应为“7/7/2019”。再次感谢您的帮助。
    • 请重新检查答案。
    • 这个答案也适用于我,但是我遇到了时区必须是 type:String 的问题。为了解决这个问题,我在 Utilities.formatDate(thisSheetDate, undefined, "MMMMM d, yyyy") 中加入了 "GMT" 而不是 undefined。希望这对遇到此问题的其他人有所帮助
    【解决方案2】:

    此代码采用 OP 在工作表名称“B3”单元格中输入的单个日期,例如“Sheet1;它循环 30 次,创建初始电子表格的副本,每次将基于数据的工作表名称增加 1 天时间。

    为确保准确的日期数学,建议单元格“B3”的格式应与建议的工作表名称采用相同的样式(“MMMM dd, yyyy”)。


    function so5691088602(){
    
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheetname = "Sheet1";
      var basesheet = ss.getSheetByName(sheetname);
      var newSheetName = new Date(basesheet.getRange("B3").getValue());
      var NumDups = 30;
      for (var i=0;i<NumDups;i++){
        basesheet.activate;
        var tempDate = new Date();
        var printdate01 = Utilities.formatDate(new Date(tempDate.setDate(newSheetName.getDate()+1+i)), "GMT+10", "MMMM dd, yyyy");
        // Logger.log("DEBUG: Sheet Date = "+printdate01);
        ss.insertSheet(printdate01, {template: basesheet});
      }
    }
    

    截图

    【讨论】:

    • 嘿泰德。我尝试了这段代码,但我得到了“TypeError:无法调用 null 的方法“getRange”。我将尝试在家里的笔记本电脑上运行代码,看看会发生什么。谢谢。
    • 这表明“Sheet1”不存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2014-06-21
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多