0

、およびProduct Request Form (Responses)というラベルの付いた 3 つのシートで構成されるGoogle スプレッドシートがあります。シートには 、 、 の 3 つの列があります。Form ResponsesCliffordJimForm ResponsestimestampProductArtistProductLabel

下のセルの値に基づいて、行全体をいずれかCliffordまたはシートに移動/カットしたいと思います。たとえば、セルの値が の場合、行を に移動したい場合、セルの値が の場合、その行を に移動したいです。JimProductLabelWarnerCliffordUniversalJim

Form Responsesまた、誰かがフォームを完成させてシートにデータが入力されたらすぐにそれらを移動させることも非常に便利です。

function onEdit(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Form Responses" && r.getColumn() == 6 && r.getValue() == "Warner") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Clifford");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
}

「フォーム送信時」スクリプトの書き方を理解するのはまだ難しいと思います。セルの値が編集されたときに機能する同様のスクリプトを見つけることができましたが、フォームの送信時に行が作成されたときには機能しません。

4

3 に答える 3

4

私がこのコードを書いていたとしたら、私がたどる思考プロセスは次のとおりです。

また、誰かがフォームを完成させたときに「フォームの回答」シートが作成されたらすぐにそれらを移動させることも非常に便利です。

フォームが送信されたときに自動的にトリガーされる関数を作成できます。送信に関する情報を含むイベントを受け取ります (フォームの値と、回答シートに挿入された範囲)。

「ProductLabel」の下のセル値に基づいて、行全体を「Clifford」または「Jim」シートに移動/カットしたい

値はフォーム送信時に配信されるイベントで提供されるため、情報を他のシートにコピーするのは非常に簡単です。次のスケルトン関数は - に基づいて決定を行いProductLabel、その列の 3 つ以上の値を考慮するように簡単に進化するように設定されています。新しいフォーム データをターゲット シートにコピーするコードはまだありません (ただし、終了する前に入力が削除されます)。個人的には、フォーム以外の列をソース シートに追加し、それを使用して新しいフォーム入力を処理したら「状態」を記録する傾向がありますが、「移動」または「コピーしてから削除」に固執しましょう。 」と、聞かれたとおり。

function handleNewForm(event) {
  switch (event.namedValues.ProductLabel) {
    case "Warner":
      // write event.values to "Clifford" Sheet.
      break;
    case "Universal":
      // write event.values to "Jim" Sheet.
      break;
    default:
      // Unexpected input, needs to be handled
      break;
  }
  // We have the range that contained the input, we can clear it.
  // There are side-effects to this that you might not want.
  event.range.clear();
}

行をターゲット シートにコピーする

これを達成するには、目的の範囲が何であるかを把握し、次のようにする必要があります。

destination.setValues([event.values]);

目的の範囲を取得するには、適切なシートを開き、既存のデータ範囲 (および次の使用可能な行) を把握し、それを使用して を取得する必要がありますdestination.setValues()が機能するには、書き込まれている 2 次元配列と同じ次元であるdestination必要があります。event.valuesパラメータは 1 次元配列 (行) です。これを 2 次元配列にするには、行を表す新しい配列の唯一の要素として単純に記述します。したがって、[event.values]ターゲット シートに書き込むには、1 行 x 3 列の範囲が必要です。

あとは仕事だ!

于 2013-03-26T15:45:26.020 に答える
1

クエリ関数を使用してデータをコピーする場合、クエリはソース セルのリテラル テキスト/値のみをフェッチすることに注意してください。たとえば、データに =HYPERLINK() がある場合、クエリを使用してデータをコピーすると、リンクが削除され、アンカー テキストだけが残ります。getFormulas() 効果的に数式をコピーするには、メソッドを使用する必要があります。

このメソッドのトリッキーな点は、数式ではないすべてのセルに対して空白文字列でいっぱいの String[][] を与えることです。この結果をやみくもにターゲットに適用すると、またはsetFormulas()を使用してコピーされたすべての非公式コンテンツが空白になります。 copyTo()setValues()

次に、同じブック内でメソッドを使用して適用できる、値と数式の配列をマージするコードについて説明します。setValues()データを別のワークブックのシートに移動するには、より低レベルの作業が必要です。

于 2014-08-23T11:13:20.863 に答える
0

関数「クエリ」をセルの数式として使用するだけで簡単です。スクリプトは必要ありません。

=query (base! A1:x; "select * where c='blah' ...")

各シートに使用します。

于 2013-03-27T01:34:13.120 に答える