Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 在Google脚本中反转复选框的最佳方法是什么?_Google Apps Script_Google Sheets_Checkbox - Fatal编程技术网

Google apps script 在Google脚本中反转复选框的最佳方法是什么?

Google apps script 在Google脚本中反转复选框的最佳方法是什么?,google-apps-script,google-sheets,checkbox,Google Apps Script,Google Sheets,Checkbox,因为Google脚本不支持单选按钮,所以我尝试创建一个变通方法。虽然我已经学习了Python的基础知识,但我对Javascript/GoogleSCTIPT还是新手。我终于让我的代码开始工作了,但我觉得对于这样一个简单的任务来说,结果太笨拙了。如何优化它 以下是工作示例: 这是我的代码: const ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); function onEdit(e) { var inverted

因为Google脚本不支持单选按钮,所以我尝试创建一个变通方法。虽然我已经学习了Python的基础知识,但我对Javascript/GoogleSCTIPT还是新手。我终于让我的代码开始工作了,但我觉得对于这样一个简单的任务来说,结果太笨拙了。如何优化它

以下是工作示例:

这是我的代码:

const ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
function onEdit(e) {
  var invertedRange = { // C4:D5 is the range to follow
    top : 4,
    bottom : 5,
    left : 3,
    right : 4
  }
  var thisRow = e.range.getRow();
  var thisCol = e.range.getColumn();
 
  // Invert the checkboxes in the range
  if (thisRow <= invertedRange.bottom && thisRow >= invertedRange.top) {
    if (thisCol <= invertedRange.right && thisCol >= invertedRange.left) {
      var changeArray = ss.getRange(invertedRange.top, invertedRange.left, 2, 2).getValues();
      var invertedArray = [];
      var rPos = 0; // first row of the 2x2 matrix
      var valueToAdd = true;
      for (var readRow = invertedRange.top; readRow <= invertedRange.bottom; readRow = readRow + 1) {
        var cPos = 0; // first column of the 2x2 matrix
        var invertedPart = [];
        for (var readCol = invertedRange.left; readCol <= invertedRange.right; readCol = readCol + 1) {
          if (thisRow == readRow && thisCol == readCol) {
            var valueToAdd = changeArray[rPos][cPos]; // do not invert the checkbox that was already manually changed by user edit
          } else {
            var valueToAdd = !changeArray[rPos][cPos]; // invert all other checkboxes in the range
          }
          var invertedPart = invertedPart.concat(valueToAdd); // create an array from a pair of checkbox values
          cPos = cPos + 1;
        }
        invertedArray[rPos]=invertedPart; // add the pairs into an array
        rPos = rPos + 1;
      }
      ss.getRange(invertedRange.top, invertedRange.left, 2, 2).setValues(invertedArray); // set the chackbox values
    } return;
  }
}
const ss=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
功能OneEdit(e){
var invertDrange={//C4:D5是要遵循的范围
排名:4,
底部:5,
左:3,,
右:4
}
var thisRow=e.range.getRow();
var thisCol=e.range.getColumn();
//反转范围中的复选框
if(此行=InvertDrange.top){
if(thisCol=反相器范围左){
var changeArray=ss.getRange(invertDrange.top,invertDrange.left,2,2).getValues();
var Darray=[];
var rPos=0;//2x2矩阵的第一行
var valueToAdd=真;

对于(var readRow=invertdrange.top;readRow给出复选框无线电组行为

此OneEdit函数为任何范围提供单选按钮组行为。您需要通过设置cbrg值并选择希望组位于行或列中的方向,以A1表示法输入范围。它将通过单击将您选择的行或列中的所有其他单元格设置为true。它不支持验证值不是true或false

 function onEdit(e) {
  //e.source.toast('Entry');
  const sh = e.range.getSheet();
  const group = 'col';//change which direction that you wish to group in
  const cbrg = "C4:D5";//specifying the range the starting column and row must be greater than one. 
  const rg = sh.getRange(cbrg);
  const w = rg.getWidth();
  const h = rg.getHeight();
  const cs = rg.getColumn();
  const ce = cs + w - 1;
  const rs = rg.getRow();
  const re = rs + h - 1;
  //console.log('rs:%s,re:%s,cs:%s,ce:%s', rs, re, cs, ce);
  if (sh.getName() == 'Sheet1' && e.range.columnStart > cs - 1 && e.range.columnStart < ce + 1 && e.range.rowStart > rs - 1 && e.range.rowStart < re + 1 && e.value == 'TRUE') {
    if (group == 'row') {
      //e.source.toast('row');
      let cA = new Array(w).fill(false);
      cA[e.range.columnStart - cs] = true;
      sh.getRange(e.range.rowStart, cs, 1, cA.length).setValues([cA]);
    }
    if (group == 'col') {
      //e.source.toast('col');
      let idx = e.range.rowStart - rs;
      let cA = [];
      for (let i = 0; i < h; i++) {
        if (i == idx) cA.push([true]);
        else cA.push([false]);
      }
      sh.getRange(rs, e.range.columnStart, cA.length, 1).setValues(cA);
    }
  }
}
函数onEdit(e){
//e、 source.toast(“条目”);
const sh=e.range.getSheet();
const group='col';//更改要分组的方向
const cbrg=“C4:D5”;//指定起始列和行必须大于1的范围。
常数rg=sh.getRange(cbrg);
常量w=rg.getWidth();
常数h=rg.getHeight();
const cs=rg.getColumn();
常数ce=cs+w-1;
常量rs=rg.getRow();
常数re=rs+h-1;
//console.log('rs:%s,re:%s,cs:%s,ce:%s',rs,re,cs,ce);
如果(sh.getName()='Sheet1'和&e.range.columnStart>cs-1和&e.range.columnStartrs-1和&e.range.rowStart
下面的一个执行速度稍快,只需设置顶行(trow)、底行(brow)、左列(lcol)、右列(rcol)和无线组方向“row”或“col”就相当容易了。它只需要很少的函数调用,这非常耗时

function onEdit(e) {
  //e.source.toast('Entry');
  const sh = e.range.getSheet();
  const trow=4;//top row
  const brow=5;//bottom row
  const lcol=3;//left column
  const rcol=4;//right column
  const group = 'row';//change which direction that you wish to group in
  //console.log('trow:%s,brow:%s,lcol:%s,rcol:%s', trow, brow, lcol, rcol);
  if (sh.getName() == 'Sheet1' && e.range.columnStart >= lcol && e.range.columnStart <= rcol && e.range.rowStart >= trow && e.range.rowStart <= brow && e.value == 'TRUE') {
    if (group == 'row') {
      //e.source.toast('row');
      let cA = new Array(rcol-lcol+1).fill(false);
      cA[e.range.columnStart - lcol] = true;
      sh.getRange(e.range.rowStart, lcol, 1, cA.length).setValues([cA]);
    }
    if (group == 'col') {
      //e.source.toast('col');
      let idx = e.range.rowStart - trow;
      let cA = [];
      for (let i = 0; i < brow-trow+1; i++) {
        if (i == idx) cA.push([true]);
        else cA.push([false]);
      }
      sh.getRange(trow, e.range.columnStart, cA.length, 1).setValues(cA);
    }
  }
}
函数onEdit(e){
//e、 source.toast(“条目”);
const sh=e.range.getSheet();
const trow=4;//顶行
const brow=5;//最下面一行
const lcol=3;//左列
const rcol=4;//右列
const group='row';//更改要分组的方向
//日志('trow:%s,浏览:%s,lcol:%s,rcol:%s',trow,浏览,lcol,rcol);

如果(sh.getName()=='Sheet1'&&e.range.columnStart>=lcol&&e.range.columnStart=trow&&e.range.rowStart,您希望将它们作为列或行中的组使用吗?