【问题标题】:How to have only one box checked instead of two on Google Apps Script?如何在 Google Apps Script 上只选中一个而不是两个?
【发布时间】:2018-08-17 07:22:15
【问题描述】:
function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[1];
  if (sheet.getActiveCell() = "E11"){
    sheet.getRange('E12').activate();
    sheet.getCurrentCell().setValue('FALSE');
    sheet.getRange('E13').activate();
    sheet.getCurrentCell().setValue('FALSE');
    sheet.getRange('E14').activate();
    sheet.getCurrentCell().setValue('FALSE');
  }
  if (sheet.getActiveCell() = "E12"){
    sheet.getRange('E11').activate();
    sheet.getCurrentCell().setValue('FALSE');
    sheet.getRange('E13').activate();
    sheet.getCurrentCell().setValue('FALSE');
    sheet.getRange('E14').activate();
    sheet.getCurrentCell().setValue('FALSE');
  }
}

所以我想这样做,如果输入一个 TRUE 语句,另一个复选框将为 FALSE,反之亦然。

【问题讨论】:

  • getValue & setValue,加上 JavaScript 比较。请注意,您可以通过使用更直接的逻辑删除/替换 activate() + CurrentCell() 逻辑来简单地记录宏:获取范围 -> 执行范围

标签: google-apps-script google-sheets triggers radio-button


【解决方案1】:

GAS 官方文档包含很多有用的示例,所以遇到困难时请参考。下面的示例可能会对您有所帮助。这适用于第 1 列中两个复选框直接位于彼此下方(第 1 行和第 2 行)的情况。

function onEdit(e){

  //Checkbox coordinates. 
  var checkboxColumn = 1;
  var checkboxRows = [1, 2];
  var sheetName = "YOUR_SHEET_NAME";

  //Get the edited cell value 
  var value = e.value;

  //Get the old value
  var oldValue = e.oldValue;

  var editedRange = e.range;
  var editedSheet = editedRange.getSheet();

  if (editedSheet.getName() == sheetName && editedRange.getColumn() == checkboxColumn && checkboxRows.indexOf(editedRange.getRow()) != -1) {  

    //Get the row coordinate of the other checkbox
    var checkboxRow = checkboxRows.filter(function(rowNum) { return rowNum != editedRange.getRow();})[0];

    //set its value to the old value of the edited checkbox
    var range = editedSheet.getRange(checkboxRow, checkboxColumn).setValue(oldValue);

  }

}

【讨论】:

    【解决方案2】:

    这是@Anton'sanswer 的另一种实现,它使用RangeList 类来支持任意方向的"radio button"-分组复选框,前提是它们都在同一个工作表上(RangeList 范围源必须是在同一张工作表上)。

    function onEdit(e) {
      const sheetName = 'some sheet name',
          rbLocations = [
            {r: 1, c: 1}, // A1
            {r: 2, c: 4}, // D2
            {c: 1, r: 8}, // A8
            ...
          ];
    
      if (!e) return; // only run for sheet edits.
    
      const toggle = e.oldValue;
      if (toggle === undefined)
        return; // require edit to be of a single cell.
    
      const sheet = edited.getSheet();
      if (sheet.getName() !== sheetName)
        return; // require edit to be of the desired sheet.
    
      const edited = e.range,
          eRow = edited.getRow(),
          eCol = edited.getColumn(),
          otherRBs = rbLocations.filter(
            function (loc) {
              return loc.r !== eRow || loc.c !== eCol;
            }
          ).map(
            function (l) {
              // Create an R1C1 notation string.
              return "R" + l.r + "C" + l.c; 
            }
          );
    
      // Acquire and use a RangeList to set the same value to all the other checkboxes.
      sheet.getRangeList(otherRBs).setValue(toggle);
    }
    

    参考文献

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多