我正在使用谷歌表格和工作表作为我的在线琐事游戏。我已经把所有的床单都装饰好进行自动得分,并将每一张单张(每轮1张,5轮)的信息传递给主记分表。
为了节省我一天15分钟的时间,我想我应该学习一点Google脚本,然后写一些东西,只需点击一下就可以清除前一天的所有答案和验证。
我成功了!我以前从未用JavaScript编写过任何东西,但是在阅读developer.google上的命令说明和找到一些非常有用的堆栈溢出答案之间,我能够创建一个完全满足我需要的脚本,完全没有问题!大约5分钟前,我刚刚完成了测试,我仍然感到无比的骄傲!
但是..。我讨厌它是如此的分散和冗长。我还没搞清楚。我不知道该找什么,也不知道怎么称呼它。希望这里有人愿意帮我做这件事!
我将把完整的代码张贴在底部,但例如-我为每个工作表创建一个'lr‘变量- lr1,lr2,.lr5。然后确保LR变量的值大于1,并相应地删除行。
if (lr1 > 1){
scr1.deleteRows(2, lr1);
};
if (lr2 > 1){
scr2.deleteRows(2, lr2);
};
if (lr3 > 1){
scr3.deleteRows(2, lr3);
};
if (lr4 > 1){
scr4.deleteRows(2, lr4);
};
if (lr5 > 1){
scr5.deleteRows(2, lr5);
};但我不需要逐个拼出来,我想做这样的事情,这将贯穿所有的5个,然后停止:
set %lrcount 1
:ONE
if %lr [ $+ [ %lrcount ] ] > 1 { \\ if lr1 > 1
scr [ $+ [ %lrcount ] $+ ] .deleteRows(2, %lr [ $+ [ %lrcount ] ] \\ scr1.deleteRows(2, lr1)
inc %lrcount 1 \\ change 1 to 2(3, 4, 5)
if %lrcount < 6 { GOTO ONE } \\ 2(3, 4, 5) < 6, so repeat above
else { unset %lrcount } \\ 6 = 6, stop and move on
}不幸的是,这只是一个混蛋版本的MSL。我不知道这相当于什么。所以,任何帮助都很感激!谢谢!
完整法典:
function WipeAll() {
var ss1 = SpreadsheetApp.openById("SPREADSHEET 1 ID");
var scr1 = ss1.getSheetByName('Form Responses 1');
var lr1 = scr1.getLastRow();
var sub1 = ss1.getSheetByName('Answer Validator');
var rl1 = sub1.getRange('A:Z');
var ss2 = SpreadsheetApp.openById("SPREADSHEET 2 ID");
var scr2 = ss2.getSheetByName('Form Responses 1');
var lr2 = scr2.getLastRow();
var sub2 = ss2.getSheetByName('Answer Validator');
var rl2 = sub2.getRange('A:Z');
var ss3 = SpreadsheetApp.openById("SPREADSHEET 3 ID");
var scr3 = ss3.getSheetByName('Form Responses 1');
var lr3 = scr3.getLastRow();
var sub3 = ss3.getSheetByName('Answer Validator');
var rl3 = sub3.getRange('A:Z');
var ss4 = SpreadsheetApp.openById("SPREADSHEET 4 ID");
var scr4 = ss4.getSheetByName('Form Responses 1');
var lr4 = scr4.getLastRow();
var sub4 = ss4.getSheetByName('Answer Validator');
var rl4 = sub4.getRange('A:Z');
var ss5 = SpreadsheetApp.openById("SPREADSHEET 5 ID");
var scr5 = ss5.getSheetByName('Form Responses 1');
var lr5 = scr5.getLastRow();
var sub5 = ss5.getSheetByName('Answer Validator');
var rl5 = sub5.getRange('A:Z');
rl1.uncheck();
rl2.uncheck();
rl3.uncheck();
rl4.uncheck();
rl5.uncheck();
if (lr1 > 1){
scr1.deleteRows(2, lr1);
};
if (lr2 > 1){
scr2.deleteRows(2, lr2);
};
if (lr3 > 1){
scr3.deleteRows(2, lr3);
};
if (lr4 > 1){
scr4.deleteRows(2, lr4);
};
if (lr5 > 1){
scr5.deleteRows(2, lr5);
};
};编辑
如果您查看lamblichus提供的答案的注释,您会注意到我在运行时遇到的一个问题。我能够通过这样修改它来解决这个问题:
我认为这里的问题是循环操作必须一直引用前面的变量。我想服务器端会有一些速率限制。因此,我不再一次又一次地调用,而是将名称直接构建到循环中(因为它们永远不会改变)。
function WipeAll() {
var spreadsheetIDs = ["", "", "", "", ""];
spreadsheetIDs.forEach(spreadsheetID => {
var ss = SpreadsheetApp.openById(spreadsheetID);
var scr = ss.getSheetByName('Form Responses 1');
var lr = scr.getLastRow();
var sub = ss.getSheetByName('Answer Validator');
var rl = sub.getRange('A:Z');
rl.uncheck();
if (lr > 1) scr.deleteRows(2, lr);
});
};现在工作很好,运行时间与最初的长运行时间相同。
发布于 2020-11-20 12:09:17
您当前的代码需要大量重复。你可以用一个循环来简化这个问题。
由于唯一更改的是电子表格ID,所以您只需声明一个带有这些ID的数组并遍历它,如下所示:
function WipeAll() {
var spreadsheetIDs = ["SPREADSHEET_ID_1", "SPREADSHEET_ID_2", ...]; // Change to your actual spreadsheet IDs
var sourceSheetName = "Form Responses 1";
var subSheetName = "Answer Validator";
var subRangeNotation = "A:Z";
spreadsheetIDs.forEach(spreadsheetID => {
var ss = SpreadsheetApp.openById(spreadsheetID);
var scr = ss.getSheetByName(sourceSheetName);
var lr = scr.getLastRow();
var sub = ss.getSheetByName(subSheetName);
var rl = sub.getRange(subRangeNotation);
rl.uncheck();
if (lr > 1) src.deleteRows(2, lr);
});
};如果工作表名称或范围符号也要更改,我建议声明一个对象数组,类似于以下内容:
var sourceData = [
{
spreadsheetId: "SPREADSHEET_ID_1",
sourceSheetName: "Form Responses 1",
subSheetName: "Answer Validator",
subRangeNotation: "A:Z"
},
{
// ... Other spreadsheets data ...
}
];参考资料:
https://stackoverflow.com/questions/64924965
复制相似问题