0

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

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

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

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

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

我希望它运行的工作表的名称是“请求”,而gid=8.

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

4

2 回答 2

1

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

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

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

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

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

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

于 2012-09-30T07:59:33.103 回答
0

在您的代码中,您有(代码中的注释)

 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循环的 }

编辑:新代码应该是这样的:

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]);
  }
//}
于 2012-09-30T07:58:38.473 回答