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