google-sheets-api - 使用复选框触发各种脚本,然后清除
问题描述
我在表单表单上设置了一个带有两个按钮的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()
}
解决方案
您正确地说,在按钮单击上运行脚本似乎不适用于 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();
}
}
}
推荐阅读
- azure - az 存储容器列表。不起作用,引用已删除的存储
- javascript - 打字稿从字符串中获取枚举值
- powerbi - Power BI 排序 - 隐藏排序列
- python - sqlalchemy 中嵌套序列化程序的问题
- javascript - 如何在 vue.js 的模板中获取 body html 元素?
- python - 如何链接在两个列表之间创建连接?
- computer-vision - 图像嵌入稀疏性
- java - 在 0mq 套接字上运行的 java 计时器线程的可能替代方案
- javascript - 使用 map、reduce、filter 为 JavaScript 优化嵌套循环
- python - {“title”:“不支持的媒体类型”,无论我尝试什么都会出错:I(