【问题标题】:Change copyDown() Script to operate on just one Sheet更改 copyDown() 脚本以仅在一张工作表上操作
【发布时间】:2012-09-30 06:28:07
【问题描述】:

在 Google 表格中,我有一个带有表单响应的表格,在表格列的右侧,我有一个带有将表单数据用于函数的公式的列。

一开始,我将公式沿行向下扩展,以便他们处理新的表单提交,但发现新的表单提交会清除该行:(。

我没有在每次提交后手动扩展公式,而是安装了Andrew Stillman's copyDown() script;它所做的是在提交脚本后复制公式。

现在我遇到的问题是脚本在手动运行时可以工作,但是当我设置为在表单提交时触发时,它会将上述公式复制到该工作表 中的所有其他工作表上电子表格。我不想要那种副作用,因为它把整个电子表格弄乱了。 :((

我想做的是编辑脚本,因此它只适用于一个表单响应表,而不是所有表。但我不知道该怎么做。

我希望它运行的工作表名称是“Requests”,gid=8

如何编辑此脚本以仅适用于那一张纸?

【问题讨论】:

    标签: google-apps-script google-sheets google-forms


    【解决方案1】:

    要让代码仅在特定工作表上运行,请使用 .getSheetByName() 方法。例如:

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var reqSh = ss.getSheetByName('Requests');
    

    还有另一种可能更简单的方法。您可以尝试保留一张表格纯粹用于提交表单,并在第二张表格中使用数组公式将第一张表格中的任何值复制到第二张表格中的相同范围。

    =ARRAYFORMULA('Requests'!A1:H) 会将列 A 复制到 H。

    我和你有同样的问题,这就是解决方案。我将公式放在范围右侧列的第二张表中,并以正常方式将它们复制下来。公式引用了第二张表中的复制范围。这是一种享受。

    这个想法不是我自己想出来的 - 我确信它是由 Google 电子表格论坛上的某个人提出的。我应该给你一个帖子的链接,但我只是看了看,找不到。

    【讨论】:

    • 哇,谢谢.. 我也在寻找类似的东西作为另一种解决方案,我知道它是 arrayformula.. 但不知道它是如此简单,哈哈:P.Imma try script edit 1st tho,因为我已经设置好了
    • 很高兴帮助并感谢最佳答案投票......但也许在这种情况下你应该把它交给 Serge 而不是我,因为他提供了你要求的脚本解决方案。 :)
    • 我将使用数组解决方案,因为.. 无法让脚本工作.. 所以这是最好的答案
    【解决方案2】:

    在您的代码中(代码中的 cmets)

     var sheets = ss.getSheets() [8]; // you choose sheet [8]
     var cellAddresses = new Object();
      for (var i=0; i<sheets.length; i++) { // but you enter a for loop that adresses every sheet in turn...
        var range = sheets[i].getDataRange();
    

    你应该简单地抑制这个循环并只使用你想要继续的工作表编号......

    最简单的方法是这样做:

     var i = 8
     var sheets = ss.getSheets() [i];
     var cellAddresses = new Object();
        var range = sheets[i].getDataRange();
      ...
    

    并在循环结束时删除适合 for 循环的 }

    EDIT:新代码应该是这样的:

    function copydown() {
      setCopyDownUid();
      setCopyDownSid();
      logCopyDown();
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheets = ss.getSheets() [8];
      var cellAddresses = new Object();
      var i=8
    //  for (var i=0; i<sheets.length; i++) {
        var range = sheets[i].getDataRange();
        var lastRow = range.getLastRow();
        var values = range.getValues();
        for (var j=0; j<values.length; j++) {
          for (var k=0; k<values[j].length; k++) {
            var test = values[j][k].toString();
            var start = test.indexOf("copydown");
              if (start == 0) {
                start = start+10;
                var end = test.length-2;
                var length = end-start;
                var value = test.substr(start, length);
                var col = k+1;
                var nextRow = j+2;
                var numRows = lastRow-(nextRow-1);
                if (numRows>0) {
                  var destRange = sheets[i].getRange(nextRow, col, numRows, 1);
                  destRange.clear();
                  var newLastRow = sheets[i].getDataRange().getLastRow();
                  var newNumRows = newLastRow-(nextRow-1);
                  var newDestRange = sheets[i].getRange(nextRow, col, newNumRows, 1);
                  var cell = sheets[i].getRange(nextRow-1, col);
                  cell.setFormula(value);
                  cell.copyTo(newDestRange);
                }
                var cellAddress = cell.getA1Notation();
                cellAddresses[cellAddress] = test;
              }
          }
        }
        Utilities.sleep(500);
        resetCellValues(cellAddresses, sheets[i]);
      }
    //}
    

    【讨论】:

    • 我试一试,fullofgas 的其他代码无法使脚本正常工作,但我确实喜欢他的数组解决方案,如果一切都失败了,我会使用它。
    • 关于循环的部分有点混乱
    • 我试过.. idk 我得到了错误.. 我把代码放在第二个盒子里.. 并在最后删除 }.. 它保存但运行它给了我错误:/
    • 您必须注意删除哪个 },如果您在编辑器中查看,当您的光标位于第一个 } 时,} 会成对突出显示,您不能错过它
    • 我把它复制过来了..尝试手动刷新功能并得到这个“脚本复制遇到错误关闭”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多