0

Google スプレッドシートには、フォームの回答を含むシートがあり、フォーム列の右側には、フォーム データを関数に使用する数式を含む列があります。

最初に、数式を行に拡張して、新しいフォームの送信に取り組んでいましたが、新しいフォームの送信によって行がクリアされることがわかりました:(。

送信ごとに数式を手動で拡張する代わりに、Andrew Stillman のcopyDown()スクリプトをインストールしました。スクリプトが送信された後、数式をコピーします。

今私が抱えている問題は、手動で実行するとスクリプトが機能することですが、フォームの送信時にトリガーするように設定すると、そのシートスプレッドシートの他のすべてのシートに上記の式がコピーされます。スプレッドシート全体が台無しになるので、その副作用は望ましくありません。:(((

私がやろうと思ったのは、スクリプトを編集して、すべてのシートではなく、1 つの Form Response シートでのみ機能するようにすることです。しかし、私はそれを行う方法がわかりません。

実行したいシートの名前は「Requests」で、gid=8.

このスクリプトを編集して、その 1 つのシートでのみ機能するようにするにはどうすればよいですか?

4

2 に答える 2

1

特定のシートだけで実行するコードを取得するには、.getSheetByName() メソッドを使用します。例えば:

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

もっと簡単かもしれない別の方法があります。フォーム送信用に 1 つのシートを保持し、2 番目のシートで arrayformula を使用して、最初のシートの値を 2 番目のシートの同じ範囲にコピーすることができます。

=ARRAYFORMULA('Requests'!A1:H) は、列 A を H にコピーします。

私はあなたと同じ問題を抱えていましたが、これが解決策でした。数式を範囲の右側の列の 2 番目のシートに配置し、通常の方法でコピーしました。数式は、2 番目のシートにコピーされた範囲を参照していました。それは御馳走でした。

私自身がこのアイデアを思いついたわけではありません。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ます

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