首页 > 解决方案 > 使用复选框触发各种脚本,然后清除

问题描述

我在表单表单上设置了一个带有两个按钮的Google表单,这些按钮连接到两个不同的脚本。它们在 PC 上完美运行,但不幸的是,自定义按钮似乎仍然无法在平板电脑的 Google 表格应用程序上运行。我能够通过下拉框合并一个解决方法,但这仍然有点挑剔,所以我想知道我是否可以将 PC 和平板电脑用户都切换到复选框。

如果选中单元格 G3 中的复选框,则应运行 AUTOFILL 脚本并清除复选框;随后,如果选中单元格 G5 中的复选框,则应该运行 UPDATE 脚本并清除其复选框。

既然复选框是 Google 表格中的一个东西,那么最好的方法是什么?

这是我目前正在使用的代码,适用于按钮和下拉菜单:

    function onEdit(e) {
      if (e.range.getA1Notation() == 'D3') {
        if (/^\w+$/.test(e.value)) {        
          eval(e.value)();
          e.range.clearContent();
        }
      }
    }

    function AUTOFILL() {
      var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
      var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form');
      var valueOfData = sheet1.getRange(sheet1.getLastRow(), 1).getValue();
      sheet2.getRange('B3').setValue(valueOfData + 1);
    } 

    function UPDATE() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var formSS = ss.getSheetByName("Form");
    var dataSheet = ss.getSheetByName("Data");

    var values = formSS.getRange("B3:B6").getValues().reduce(function(a, b) {
        return a.concat(b)
    });
    var partNum = values[0];
    var row;
    dataSheet.getDataRange().getValues().forEach(function(r, i) {
        if (r[0] === partNum) {
            row = i + 1
        }
    })
    row = row ? row : dataSheet.getLastRow() + 1;
    var data = dataSheet.getRange(row, 1, 1, 4).getValues()[0].map(function (el, ind){
      return el = values[ind] ? values[ind] : el;
      })


        var now = [new Date()];
    var newData =  data.concat(now)
    dataSheet.getRange(row, 1, 1, 5).setValues([newData]);


    formSS.getRange("B3:B6").clearContent()
    }

标签: google-sheets-api

解决方案


您正确地说,在按钮单击上运行脚本似乎不适用于 Android 移动应用程序。这是一个已经被报告的问题(参见这个这个)。一个常见的解决方法是使用Android 插件,但现在已弃用。

为了使您的脚本使用复选框运行,您可以做的一件事是修改您的 onEdit 函数。经过以下修改后,它会检查是否有任何复选框被启用,并在此基础上运行相应的函数,然后再次禁用它。您可以在下面看到更新的 onEdit 函数:

function onEdit(e) {
  var isAutofill = SpreadsheetApp.getActiveSheet().getRange("G3").getValue();
  var isUpdate = SpreadsheetApp.getActiveSheet().getRange("G5").getValue();

  if (isAutofill && isUpdate) {
    Browser.msgBox("You cannot autofill and update at once!");
    SpreadsheetApp.getActiveSheet().getRange("G3").setValue(false);
    SpreadsheetApp.getActiveSheet().getRange("G5").setValue(false);
  } else if (isAutofill) {
    AUTOFILL();
    SpreadsheetApp.getActiveSheet().getRange("G3").setValue(false);
  } else if (isUpdate) {
    UPDATE();
    SpreadsheetApp.getActiveSheet().getRange("G5").setValue(false);
  }

  if (e.range.getA1Notation() == 'D3') {
    if (/^\w+$/.test(e.value)) {        
      eval(e.value)();
      e.range.clearContent();
    }
  }
}

推荐阅读