在Google表格中我有一张带有表单回复的表单,在表单列的右侧,我有包含公式的列,这些公式使用表单数据作为函数。
一开始,我将公式扩展到行,以便他们处理新表单提交,但发现新表单提交将清除行:(。
我没有在每次提交后手动扩展公式,而是安装了Andrew Stillman's copyDown()
script;它的作用是在提交脚本后复制公式。
现在我遇到的问题是脚本在手动运行时有效,但是当我设置为触发表单提交时,它会复制该表上的所述公式和在所有其他工作表上电子表格。我不想要那种副作用,因为它会混淆整个电子表格。 :((
我想要做的是编辑脚本,使其仅适用于一张表单响应表,而不是所有表单。但我不知道该怎么做。
我希望它运行的工作表的名称是“请求”和gid=8
。
如何编辑此脚本以仅适用于那一张?
答案 0 :(得分:1)
要使代码仅在特定工作表上运行,请使用.getSheetByName()方法。例如:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var reqSh = ss.getSheetByName('Requests');
还有另一种方法可能更容易。您可以尝试保留一张仅用于表单提交的表单,并使用第二张表格中的数组表格将第一张表格中的任何值复制到第二张表格中的相同范围。
= ARRAYFORMULA('请求'!A1:H)会将A列复制到H.
我和你有同样的问题,这就是解决方案。我将公式放在范围右侧列中的第二张表格中,并以正常方式将其复制下来。公式引用第二张表中的复制范围。这是一种享受。
我自己没有提出这个想法 - 我确信这是谷歌电子表格论坛上有人建议的。我应该给你一个帖子的链接,但我只是看了,我找不到它。
答案 1 :(得分: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]);
}
//}