使用 google 应用程序脚本对行进行分组
Group rows using google apps scripts
我正在编写代码,用户可以在其中自动生成课程和子主题的模板。每节课将有10个子主题。
我还需要按课程和主题对行进行分组。
但是,我无法按课程和主题对行进行分组。尝试使用宏录制器,但代码在生成多个课程时不起作用。
编辑:工作代码更新如下。
function shiftrowgroupdepth() {
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getActiveSheet();
// start from row 6 and column 2
var row = 6;
var col = 2;
//Ask user for the no. of lessons
var shlen = Browser.inputBox("Enter no of lessons", Browser.Buttons.OK_CANCEL);
for (var i = 1; i <= shlen; i++) {
sheet.getRange(row,col).setValue("Lesson " + i);
row++;
Logger.log(spreadsheet.getCurrentCell().getRow())
sheet.getRange(row, 1, 70, sheet.getMaxColumns()).activate()
.shiftRowGroupDepth(1);
// Add sub-topics (1.1, 1.2 ....)
for (var j=1;j<=10;j++){
sheet.getRange(row,col).setValue(i+"."+j);
sheet.getRange(row+1, 1, 6, sheet.getMaxColumns()).activate()
.shiftRowGroupDepth(1);
row=row+7;
}
}
};
OP 代码非常接近目标。这个答案的主要变化是:
当主题代码使用 'dot' 分隔符时,Google sheets 将结果值视为数字;这会产生显示“1.10”的问题。我将分隔符更改为 'dash'。毫无疑问,还有另一种使用 toString
的潜在方法 - 但这既快速又简单。
课程分组很简单; 10 个主题,每个主题 7 行 = 70 行。
主题分组因引用 "current cell" 的位置而变得复杂 - 它可能在 sheet 上的任何位置。我通过使用 row
变量简化了这一点,OP 已经(正确地)增加了该变量。
function so5774532602() {
var ss = SpreadsheetApp.getActive();
var sheetname = "OPSheet";
var sheet = ss.getSheetByName(sheetname);
var row = 6;
var col = 2;
//Ask user for the no. of lessons
var shlen = Browser.inputBox("Enter no of lessons", Browser.Buttons
.OK_CANCEL);
for (var i = 1; i <= shlen; i++) {
sheet.getRange(row, col).setValue("Lesson " + i);
// add grouping
// Logger.log("DEBUG: i = "+i+", lesson range = "+sheet.getRange(+(row + 1), 2, 70, 1).getA1Notation());
sheet.getRange(+(row + 1), 2, 70, 1).activate()
.shiftRowGroupDepth(1);
row++;
// Add sub-topics (1.1, 1.2 ....) leave 6 blank rows below each sub-topic. Then, group those blank rows
for (var j = 1; j <= 10; j++) {
// Logger.log("DEBUG: i = "+i+", j = "+j+", row = "+row+", col = "+col); // new
sheet.getRange(row, col).setValue(i + "-" + j);
// add grouping
// Logger.log("DEBUG: range details: row = "+(row + 1) +",column = 1"+"number of rows = "+6+", number of columns = 1");
// Logger.log("DEBUG: topic range = "+sheet.getRange(+(row + 1), 2, 6, 1).getA1Notation());
sheet.getRange(+(row + 1), 2, 6, 1).activate()
.shiftRowGroupDepth(1);
row = row + 7;
}
}
}
编辑
格式的两个小变化
sheet.getRange(row,col).setValue("Lesson " + i).setHorizontalAlignment("center");
将课程编号居中列中。
sheet.getRange(row,col).setNumberFormat("@").setValue(i+"."+j).setHorizontalAlignment("center");
return 到 'dot' 分隔符,但使第十个主题显示为 1.10,等等(信用@Tanaike)。还将使列中的文本居中。
我正在编写代码,用户可以在其中自动生成课程和子主题的模板。每节课将有10个子主题。
我还需要按课程和主题对行进行分组。
但是,我无法按课程和主题对行进行分组。尝试使用宏录制器,但代码在生成多个课程时不起作用。
编辑:工作代码更新如下。
function shiftrowgroupdepth() {
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getActiveSheet();
// start from row 6 and column 2
var row = 6;
var col = 2;
//Ask user for the no. of lessons
var shlen = Browser.inputBox("Enter no of lessons", Browser.Buttons.OK_CANCEL);
for (var i = 1; i <= shlen; i++) {
sheet.getRange(row,col).setValue("Lesson " + i);
row++;
Logger.log(spreadsheet.getCurrentCell().getRow())
sheet.getRange(row, 1, 70, sheet.getMaxColumns()).activate()
.shiftRowGroupDepth(1);
// Add sub-topics (1.1, 1.2 ....)
for (var j=1;j<=10;j++){
sheet.getRange(row,col).setValue(i+"."+j);
sheet.getRange(row+1, 1, 6, sheet.getMaxColumns()).activate()
.shiftRowGroupDepth(1);
row=row+7;
}
}
};
OP 代码非常接近目标。这个答案的主要变化是:
当主题代码使用 'dot' 分隔符时,Google sheets 将结果值视为数字;这会产生显示“1.10”的问题。我将分隔符更改为 'dash'。毫无疑问,还有另一种使用
toString
的潜在方法 - 但这既快速又简单。课程分组很简单; 10 个主题,每个主题 7 行 = 70 行。
主题分组因引用 "current cell" 的位置而变得复杂 - 它可能在 sheet 上的任何位置。我通过使用
row
变量简化了这一点,OP 已经(正确地)增加了该变量。
function so5774532602() {
var ss = SpreadsheetApp.getActive();
var sheetname = "OPSheet";
var sheet = ss.getSheetByName(sheetname);
var row = 6;
var col = 2;
//Ask user for the no. of lessons
var shlen = Browser.inputBox("Enter no of lessons", Browser.Buttons
.OK_CANCEL);
for (var i = 1; i <= shlen; i++) {
sheet.getRange(row, col).setValue("Lesson " + i);
// add grouping
// Logger.log("DEBUG: i = "+i+", lesson range = "+sheet.getRange(+(row + 1), 2, 70, 1).getA1Notation());
sheet.getRange(+(row + 1), 2, 70, 1).activate()
.shiftRowGroupDepth(1);
row++;
// Add sub-topics (1.1, 1.2 ....) leave 6 blank rows below each sub-topic. Then, group those blank rows
for (var j = 1; j <= 10; j++) {
// Logger.log("DEBUG: i = "+i+", j = "+j+", row = "+row+", col = "+col); // new
sheet.getRange(row, col).setValue(i + "-" + j);
// add grouping
// Logger.log("DEBUG: range details: row = "+(row + 1) +",column = 1"+"number of rows = "+6+", number of columns = 1");
// Logger.log("DEBUG: topic range = "+sheet.getRange(+(row + 1), 2, 6, 1).getA1Notation());
sheet.getRange(+(row + 1), 2, 6, 1).activate()
.shiftRowGroupDepth(1);
row = row + 7;
}
}
}
编辑 格式的两个小变化
sheet.getRange(row,col).setValue("Lesson " + i).setHorizontalAlignment("center");
将课程编号居中列中。sheet.getRange(row,col).setNumberFormat("@").setValue(i+"."+j).setHorizontalAlignment("center");
return 到 'dot' 分隔符,但使第十个主题显示为 1.10,等等(信用@Tanaike)。还将使列中的文本居中。