Javascript 我想为google sheets创建一个脚本,该脚本将制作一个工作表的多个副本,并将新工作表放置在活动工作表的左侧

Javascript 我想为google sheets创建一个脚本,该脚本将制作一个工作表的多个副本,并将新工作表放置在活动工作表的左侧,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我对使用谷歌脚本非常陌生。我有一个以日期为标题的电子表格。我发现下面的脚本将使我能够创建可变数量的重复工作表。脚本还将通过将日期更改为下一个日期来自动重命名新图纸。唯一的问题是,所有新工作表都添加到文档的最右侧。我希望每个副本都放置在活动工作表的左侧。因此,如果我有一个标题为1/3/21的选项卡,并且我复制了该选项卡的3个副本,那么新的选项卡将从左到右读取1/6/21;1/5/21; 1/4/21. 这是我正在使用的脚本。我必须禁用“启用ChromeV8运行时”才能让这个脚本工作 functio

我对使用谷歌脚本非常陌生。我有一个以日期为标题的电子表格。我发现下面的脚本将使我能够创建可变数量的重复工作表。脚本还将通过将日期更改为下一个日期来自动重命名新图纸。唯一的问题是,所有新工作表都添加到文档的最右侧。我希望每个副本都放置在活动工作表的左侧。因此,如果我有一个标题为1/3/21的选项卡,并且我复制了该选项卡的3个副本,那么新的选项卡将从左到右读取1/6/21;1/5/21; 1/4/21. 这是我正在使用的脚本。我必须禁用“启用ChromeV8运行时”才能让这个脚本工作

function duplicatesheet() {
  var as = SpreadsheetApp.getActiveSpreadsheet(); // active spreadsheet
  var s = as.getActiveSheet(); // first sheet object
  var dateCell = "A6:N6"; // cell containing first date
  var N = 5; // 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, "MM/dd/yy")); // sets the name of     the new sheet
  }
}
函数重复表(){
var as=SpreadsheetApp.getActiveSpreadsheet();//活动电子表格
var s=as.getActiveSheet();//第一个工作表对象
var dateCell=“A6:N6”;//包含第一个日期的单元格
var N=5;//要制作的副本数
var startDate=new Date(s.getRange(dateCell).getValue();//获取存储在dateCell中的日期
var day=startDate.getDate();//提取日期
var month=startDate.getMonth();//提取月份
var year=startDate.getFullYear();//提取年份
//循环N次
对于(变量i=0;i
这似乎很容易做到:

函数myFunction(){
设ss=SpreadsheetApp.getActiveSpreadsheet();
let sheet=SpreadsheetApp.getActiveSheet();
让index=sheet.getIndex();
插入页(“新页”,索引-1,{模板:页,});
}
执行此代码后,工作表在执行后应如下所示:

参考文献
说明: 正如另一位解释的,您可以使用。这个答案解释了如何将该函数合并到代码中,以及如何使代码更快、更高效

  • 在您的代码中,dateCell是一个单元格范围
    “A6:N6”
    ,但您只需要一个值,即
    A6
    。因此,只需将其更改为
    A6

  • 您不需要创建具有您的值的日期对象。如果工作表中的
    A6
    包含日期值,则
    GAS
    将正确拾取该值

  • 您不需要迭代地构建自己的日期对象。您可以使用:

    startDate.setDate(startDate.getDate()+1);
    
    这将使日期增加一天。通过这种方式,您可以去掉
    变量

  • 我不知道为什么将
    未定义的
    作为
    实用程序.formatDate
    的第二个参数,也不知道为什么脚本编辑器没有删除错误。但是您可能想使用
    作为.getSpreadsheetTimeZone()

  • 要将工作表正确插入到
    for
    循环中活动工作表的左侧,您需要一个类似
    sindex-N+1
    的索引表达式。之所以使用
    +1
    ,是因为从
    1
    开始计数。也就是说,对于文档中的第一页,
    getIndex
    将返回
    1
    。但是
    insertSheet
    中的
    sheetIndex
    参数接受从
    0
    开始的索引

解决方案:
函数重复表(){
var as=SpreadsheetApp.getActiveSpreadsheet();
var s=as.getActiveSheet();
var sindex=s.getIndex();
var dateCell=“A6”;
var N=2;
var startDate=s.getRange(dateCell).getValue();
//循环N次
对于(变量i=0;i可以考虑使用,因为它允许您设置要添加选项卡的索引。然后你可以复制这些值。我不明白为什么你会得到多个单元格范围内的单个值:
s.getRange(dateCell).getValue()
。此外,您不需要像这样构造日期对象来增加日期。您可以通过
startDate.setDate(startDate.getDate()+1)
获取明天的日期。最后一行代码中的
undefined
也没有意义。马里奥,非常感谢您的简要回复、编辑和解释。这非常有用。我们做了以下调整:我们通常希望制作7张新的工作表(有一周的新标签)。当我们将var N=2增加到var N=7时,新的选项卡开始出现在活动工作表的左侧,而不是立即出现在活动工作表的左侧。我们通过改变sindex-N+1解决了这个问题;对sindex-N+(N-1);我们还希望选项卡名称在日期格式中不使用前导零。为此,我们将“MM/dd/yy”改为“M/d/yy”
function duplicatesheet() {
  var as = SpreadsheetApp.getActiveSpreadsheet(); 
  var s = as.getActiveSheet(); 
  var sindex = s.getIndex();
  var dateCell = "A6"; 
  var N = 2; 
  var startDate = s.getRange(dateCell).getValue();
  // loop over N times
  for (var i = 0; i < N; i++) {
    startDate.setDate(startDate.getDate()+1);
    var startDateStr = Utilities.formatDate(startDate, as.getSpreadsheetTimeZone(), "MM/dd/yy")
    var asn=as.insertSheet(startDateStr, sindex-N+1, {template: s});
    asn.getRange(dateCell).setValue(startDate); 
  }
}