首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Google电子表格脚本中压缩命令/操作/变量?

如何在Google电子表格脚本中压缩命令/操作/变量?
EN

Stack Overflow用户
提问于 2020-11-20 06:45:26
回答 1查看 45关注 0票数 1

我正在使用谷歌表格和工作表作为我的在线琐事游戏。我已经把所有的床单都装饰好进行自动得分,并将每一张单张(每轮1张,5轮)的信息传递给主记分表。

为了节省我一天15分钟的时间,我想我应该学习一点Google脚本,然后写一些东西,只需点击一下就可以清除前一天的所有答案和验证。

我成功了!我以前从未用JavaScript编写过任何东西,但是在阅读developer.google上的命令说明和找到一些非常有用的堆栈溢出答案之间,我能够创建一个完全满足我需要的脚本,完全没有问题!大约5分钟前,我刚刚完成了测试,我仍然感到无比的骄傲!

但是..。我讨厌它是如此的分散和冗长。我还没搞清楚。我不知道该找什么,也不知道怎么称呼它。希望这里有人愿意帮我做这件事!

我将把完整的代码张贴在底部,但例如-我为每个工作表创建一个'lr‘变量- lr1,lr2,.lr5。然后确保LR变量的值大于1,并相应地删除行。

代码语言:javascript
复制
  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个,然后停止:

代码语言:javascript
复制
  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。我不知道这相当于什么。所以,任何帮助都很感激!谢谢!

完整法典:

代码语言:javascript
复制
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提供的答案的注释,您会注意到我在运行时遇到的一个问题。我能够通过这样修改它来解决这个问题:

我认为这里的问题是循环操作必须一直引用前面的变量。我想服务器端会有一些速率限制。因此,我不再一次又一次地调用,而是将名称直接构建到循环中(因为它们永远不会改变)。

代码语言:javascript
复制
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);
  });
};

现在工作很好,运行时间与最初的长运行时间相同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-20 12:09:17

您当前的代码需要大量重复。你可以用一个循环来简化这个问题。

由于唯一更改的是电子表格ID,所以您只需声明一个带有这些ID的数组并遍历它,如下所示:

代码语言:javascript
复制
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);
  });
};

如果工作表名称或范围符号也要更改,我建议声明一个对象数组,类似于以下内容:

代码语言:javascript
复制
var sourceData = [
  {
    spreadsheetId: "SPREADSHEET_ID_1",
    sourceSheetName: "Form Responses 1",
    subSheetName: "Answer Validator",
    subRangeNotation: "A:Z"
  },
  {
    // ... Other spreadsheets data ...
  }
];

参考资料:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64924965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档