COPYDOWN()スクリプトを1シートだけで動作させる
-
11-12-2019 - |
質問
Googleシートでは、フォームレスポンスを持つシートがあり、フォーム列の右側には、Formulas for関数のフォームデータを使用する列があります。
スタート時に数式が行を伸ばしたので、新しいフォームの送信に取り組んでいましたが、新しいフォームの送信が行を消去することを発見しました:(。
は、iをインストールした後に手動で延長される代わりに、私はインストールされています。スクリプトが送信された後に数式を下げているのか。
今すぐ問題になっているのは、スクリプトが手動で実行されたときに機能することですが、フォームの送信をトリガーするように設定したときにその記号にとの他のすべてのシートにコピーします。スプレッドシート。スプレッドシート全体をめくるように、その副作用は望まない。 :((
私が考えたことはスクリプトを編集することですので、すべてのシートではなく、あるフォームレスポンスシートでのみ機能します。しかし、私はそれをする方法がわかりません。
実行したいシートの名前は「要求」、およびcopyDown()
です。
このスクリプトを編集するにはどうすればよいですか。
解決
コードのように特定のシートを実行するには、.getsheetbyname()メソッドを使用します。例えば:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var reqSh = ss.getSheetByName('Requests');
.
もう一つの方法があります。1枚のシートを純粋にフォームの提出に保ち、2枚目のシートのArrayFormulaを使用して、2番目のシートから同じ範囲内の値をコピーします。
= ArrayFormula( '要求'!A1:H)は列AからHをコピーします。
私はあなたと同じ問題を持っていました、そしてこれは解決策でした。私は範囲の右側の列の2番目のシートに数式を置き、通常の方法でそれらをコピーしました。第2シートのコピー範囲を参照する式。それは御馳走を働きました。
私は自分自身のアイデアを思い付きませんでした - 私はそれがGoogleスプレッドシートフォーラムの誰かによって提案されていたと確信しています。私はあなたに投稿へのリンクを与えるべきですが、私はちょうど見ただけで見つけることができません。
他のヒント
あなたのコードの中であなたは(コードのコメント)
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]);
}
//}