google 使用单选按钮等复选框的脚本
google script using checkboxes like radio buttons
我正在尝试在 Google 表格中使用单选按钮之类的复选框。我从 https://www.benlcollins.com/apps-script/radio-buttons-in-google-sheets/ 上的有用脚本开始,但它只处理行,不幸的是,这对我不起作用。也感谢 Ben 的代码。
因此,我希望使用 Ben 的代码作为起点,让应用程序取消选中属于一组的复选框,只选中所选的复选框。
我已经将演示设置为多项选择题和答案,有两个问题(如下面的屏幕截图所示:
我的代码是:
/**
* onEdit to uncheck checkboxes as required
*/
function onEdit(e) {
// get event object data: sheet name, row number and column number
const sheet = e.range.getSheet();
if(sheet.getName()!='questions'){return} // makes sure we only impact the one sheet we want to adjust
const row = e.range.rowStart;
console.log(row);
if (row < 8) {
var block1 = row;
}
else if(row > 8 && row < 14) {
var block2 = row;
}
switch(block1) {
// case when row 3 is checked
case 1:
sheet.getRange("B4:B7").uncheck();
break;
// case when row 4 is checked
case 2:
sheet.getRangeList(["B3","B5:B7"]).uncheck();
break;
// case when row 5 is checked
case 3:
sheet.getRangeList(["B3:B4","B6:B7"]).uncheck();
break;
// case when row 6 is checked
case 4:
sheet.getRangeList(["B3:B5","B7"]).uncheck();
break;
// case when row 7 is checked
case 5:
sheet.getRange("B3:B6").uncheck();
break;
// cell is outside of rows 3 to 7
default:
return;
}
switch (block2) {
// case when row 10 is checked
case 1:
sheet.getRange("B11:B13").uncheck();
break;
// case when row 11 is checked
case 2:
sheet.getRangeList(["B10","B12:B13"]).uncheck();
break;
// case when row 12 is checked
case 3:
sheet.getRangeList(["B10:B11","B13"]).uncheck();
break;
// case when row 13 is checked
case 4:
sheet.getRangeList(["B10:B12"]).uncheck();
break;
// cell is outside of rows 3 to 7
default:
return;
}
}
请注意,我的工作簿中有多个工作表,因此需要在第 7 行进行测试。
目前唯一能按我预期的方式工作的单元格是 B7。
对此我有点头疼,所以寻求一些指导。
我没有为每个问题使用 switch 语句,而是创建了一个适用于列 B 中任何框的函数(您可以更改为适合您需要的列)。您不必为每个问题创建单独的 switch 语句。
工作原理
onEdit() 检查编辑的单元格是否在目标的第 2 栏中 sheet,以及是否选中了该框(设置为 true)。
然后向上查找该问题组中的第一个单元格,然后向下查找该问题组中的最后一个单元格。
然后它遍历该问题集中的所有行号,并取消选中任何不是已编辑单元格的框。
有一个警告 - 包含问题的行中必须包含某些内容,函数才能找到问题范围的顶部。见下文
const ss = SpreadsheetApp.getActive();
function onEdit(e){
let cell = e.range;
let value = e.value;
let sheet = e.source.getActiveSheet();
Logger.log(cell.getA1Notation()+" "+sheet.getName() + " "+ value);
let col = cell.getColumn()
if(col === 2 && sheet.getName() === "Question" && value === "TRUE") {
// get the row numbers of the top and bottom check boxes in this question set
let topRow = cell.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
let bottomRow = cell.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
// get the number of rows in this question set, the + before the variables forces
// app script to treat them as a number.
let numOfRows = +bottomRow - +topRow +1;
Logger.log("Top Row: "+topRow + " bottom row: "+bottomRow+" number of rows: " + numOfRows);
// loop through each box in the question set and uncheck any that weren't the edited cell
for (var i = 0; i < numOfRows; i++){
let box = sheet.getRange(+topRow + +i, 2);
let boxA1 = box.getA1Notation();
Logger.log(boxA1);
if (boxA1 !== cell.getA1Notation()){
Logger.log("Box does not equal cell");
box.uncheck();
}
}
}
}
这是我测试的图片sheet:
知道了。代码如下:
/**
* onEdit to uncheck checkboxes as required
*/
function onEdit(e) {
// get event object data: sheet name, row number and column number
const sheet = e.range.getSheet();
if(sheet.getName()!='questions'){return} // makes sure we only impact the one sheet we want to adjust
const row = e.range.rowStart;
console.log(row);
if (row < 8) {
var block1 = row;
var loopid=1;
}
else if( 8 > row < 14) {
var block2 = row;
var loopid=2;
}
if (loopid== 1) {
switch(block1) {
// case when row 3 is checked
case 3:
sheet.getRange("B4:B7").uncheck();
break;
// case when row 4 is checked
case 4:
sheet.getRangeList(["B3","B5:B7"]).uncheck();
break;
// case when row 5 is checked
case 5:
sheet.getRangeList(["B3:B4","B6:B7"]).uncheck();
break;
// case when row 6 is checked
case 6:
sheet.getRangeList(["B3:B5","B7"]).uncheck();
break;
// case when row 7 is checked
case 7:
sheet.getRange("B3:B6").uncheck();
break;
// cell is outside of rows 3 to 7
default:
return;
}
}
if (loopid==2) {
switch (block2) {
// case when row 10 is checked
case 10:
sheet.getRange("B11:B13").uncheck();
break;
// case when row 11 is checked
case 11:
sheet.getRangeList(["B10","B12:B13"]).uncheck();
break;
// case when row 12 is checked
case 12:
sheet.getRangeList(["B10:B11","B13"]).uncheck();
break;
// case when row 13 is checked
case 13:
sheet.getRange(["B10:B12"]).uncheck();
break;
// cell is outside of rows 10-14
default:
return;
}
}
}
您可以测试区域...
function onEdit(e) {
var s = e.source.getActiveSheet();
var r = e.source.getActiveRange();
if(s.getName()!='questions'){return}
if(r.getColumn()!=2){return}
var col = 2;
var region = r.getDataRegion()
var begin = region.getRow()+1;
var height = region.getNumRows()-1;
var row = r.getRow();
if (r.getValue()) {
var values = s.getRange(begin,col,height,1).getValues()
for (var i=0;i<values.length;i++){
values[i][0]=false
}
values[row-begin][0]=true
s.getRange(begin,col,height,1).setValues(values)
}
}
https://docs.google.com/spreadsheets/d/14vJjimVVfd_-G_M2sT7m1CjBr-rLaVhyYW0e622VDsE/copy
我正在尝试在 Google 表格中使用单选按钮之类的复选框。我从 https://www.benlcollins.com/apps-script/radio-buttons-in-google-sheets/ 上的有用脚本开始,但它只处理行,不幸的是,这对我不起作用。也感谢 Ben 的代码。
因此,我希望使用 Ben 的代码作为起点,让应用程序取消选中属于一组的复选框,只选中所选的复选框。
我已经将演示设置为多项选择题和答案,有两个问题(如下面的屏幕截图所示:
我的代码是:
/**
* onEdit to uncheck checkboxes as required
*/
function onEdit(e) {
// get event object data: sheet name, row number and column number
const sheet = e.range.getSheet();
if(sheet.getName()!='questions'){return} // makes sure we only impact the one sheet we want to adjust
const row = e.range.rowStart;
console.log(row);
if (row < 8) {
var block1 = row;
}
else if(row > 8 && row < 14) {
var block2 = row;
}
switch(block1) {
// case when row 3 is checked
case 1:
sheet.getRange("B4:B7").uncheck();
break;
// case when row 4 is checked
case 2:
sheet.getRangeList(["B3","B5:B7"]).uncheck();
break;
// case when row 5 is checked
case 3:
sheet.getRangeList(["B3:B4","B6:B7"]).uncheck();
break;
// case when row 6 is checked
case 4:
sheet.getRangeList(["B3:B5","B7"]).uncheck();
break;
// case when row 7 is checked
case 5:
sheet.getRange("B3:B6").uncheck();
break;
// cell is outside of rows 3 to 7
default:
return;
}
switch (block2) {
// case when row 10 is checked
case 1:
sheet.getRange("B11:B13").uncheck();
break;
// case when row 11 is checked
case 2:
sheet.getRangeList(["B10","B12:B13"]).uncheck();
break;
// case when row 12 is checked
case 3:
sheet.getRangeList(["B10:B11","B13"]).uncheck();
break;
// case when row 13 is checked
case 4:
sheet.getRangeList(["B10:B12"]).uncheck();
break;
// cell is outside of rows 3 to 7
default:
return;
}
}
请注意,我的工作簿中有多个工作表,因此需要在第 7 行进行测试。
目前唯一能按我预期的方式工作的单元格是 B7。
对此我有点头疼,所以寻求一些指导。
我没有为每个问题使用 switch 语句,而是创建了一个适用于列 B 中任何框的函数(您可以更改为适合您需要的列)。您不必为每个问题创建单独的 switch 语句。
工作原理
onEdit() 检查编辑的单元格是否在目标的第 2 栏中 sheet,以及是否选中了该框(设置为 true)。
然后向上查找该问题组中的第一个单元格,然后向下查找该问题组中的最后一个单元格。
然后它遍历该问题集中的所有行号,并取消选中任何不是已编辑单元格的框。
有一个警告 - 包含问题的行中必须包含某些内容,函数才能找到问题范围的顶部。见下文
const ss = SpreadsheetApp.getActive();
function onEdit(e){
let cell = e.range;
let value = e.value;
let sheet = e.source.getActiveSheet();
Logger.log(cell.getA1Notation()+" "+sheet.getName() + " "+ value);
let col = cell.getColumn()
if(col === 2 && sheet.getName() === "Question" && value === "TRUE") {
// get the row numbers of the top and bottom check boxes in this question set
let topRow = cell.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
let bottomRow = cell.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
// get the number of rows in this question set, the + before the variables forces
// app script to treat them as a number.
let numOfRows = +bottomRow - +topRow +1;
Logger.log("Top Row: "+topRow + " bottom row: "+bottomRow+" number of rows: " + numOfRows);
// loop through each box in the question set and uncheck any that weren't the edited cell
for (var i = 0; i < numOfRows; i++){
let box = sheet.getRange(+topRow + +i, 2);
let boxA1 = box.getA1Notation();
Logger.log(boxA1);
if (boxA1 !== cell.getA1Notation()){
Logger.log("Box does not equal cell");
box.uncheck();
}
}
}
}
这是我测试的图片sheet:
知道了。代码如下:
/**
* onEdit to uncheck checkboxes as required
*/
function onEdit(e) {
// get event object data: sheet name, row number and column number
const sheet = e.range.getSheet();
if(sheet.getName()!='questions'){return} // makes sure we only impact the one sheet we want to adjust
const row = e.range.rowStart;
console.log(row);
if (row < 8) {
var block1 = row;
var loopid=1;
}
else if( 8 > row < 14) {
var block2 = row;
var loopid=2;
}
if (loopid== 1) {
switch(block1) {
// case when row 3 is checked
case 3:
sheet.getRange("B4:B7").uncheck();
break;
// case when row 4 is checked
case 4:
sheet.getRangeList(["B3","B5:B7"]).uncheck();
break;
// case when row 5 is checked
case 5:
sheet.getRangeList(["B3:B4","B6:B7"]).uncheck();
break;
// case when row 6 is checked
case 6:
sheet.getRangeList(["B3:B5","B7"]).uncheck();
break;
// case when row 7 is checked
case 7:
sheet.getRange("B3:B6").uncheck();
break;
// cell is outside of rows 3 to 7
default:
return;
}
}
if (loopid==2) {
switch (block2) {
// case when row 10 is checked
case 10:
sheet.getRange("B11:B13").uncheck();
break;
// case when row 11 is checked
case 11:
sheet.getRangeList(["B10","B12:B13"]).uncheck();
break;
// case when row 12 is checked
case 12:
sheet.getRangeList(["B10:B11","B13"]).uncheck();
break;
// case when row 13 is checked
case 13:
sheet.getRange(["B10:B12"]).uncheck();
break;
// cell is outside of rows 10-14
default:
return;
}
}
}
您可以测试区域...
function onEdit(e) {
var s = e.source.getActiveSheet();
var r = e.source.getActiveRange();
if(s.getName()!='questions'){return}
if(r.getColumn()!=2){return}
var col = 2;
var region = r.getDataRegion()
var begin = region.getRow()+1;
var height = region.getNumRows()-1;
var row = r.getRow();
if (r.getValue()) {
var values = s.getRange(begin,col,height,1).getValues()
for (var i=0;i<values.length;i++){
values[i][0]=false
}
values[row-begin][0]=true
s.getRange(begin,col,height,1).setValues(values)
}
}
https://docs.google.com/spreadsheets/d/14vJjimVVfd_-G_M2sT7m1CjBr-rLaVhyYW0e622VDsE/copy