0

助けが必要です - ここにちょっとした歴史があります..

Google スケジュールがあります - https://docs.google.com/spreadsheet/ccc?key=0ArmKEmhue9OgdEFwMHBldFpGenNVdzJUQThCQU9Qcmc&usp=sharing

そのスケジュール内には多数のシートがありますが、私が助けを得たいと思っていたのは Form Responses 1 と PROJECTS シートです

私はGoogleフォームを持っています - https://docs.google.com/forms/d/1yFy3i5H3abhFjdvchuJq2ARODcfRGo6KNkOAgeRIMMU/viewform

これは Google のスケジュールにリンクされており、送信ごとにデータが Form Responses 1 シートに入ります -

スプレッドシートに適用されるスクリプトがあります -

スクリプトへの/からのコピー

/**
 * A function named onEdit will be called whenever
 * a change is made to the spreadsheet.
 * 
 * @param  {object} e The edit event (not used in this case)
 */
function onFormSubmit(e){
  var copyFromRange = 'Form Responses 1!A2:AC999';
  var copyToRangeStart = 'PROJECTS!A71:AC999';
  copyValuesOnly(copyFromRange, copyToRangeStart);
}

/**
 * This function will copy the values from a given range to
 * a second range, which starts from the given cell reference
 * 
 * @param  {string} copyFromRange    Range reference eg: 
 * @param  {string} copyToRangeStart Cell reference eg:
 */
function copyValuesOnly(copyFromRange, copyToRangeStart) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var source = ss.getRange(copyFromRange);
  source.copyTo(ss.getRange(copyToRangeStart), {contentsOnly: true});
}

これにより、データを PROJECTS シートにコピーできるようになるため、複数のユーザーが編集および更新できますが、新しい提出物が届くたびにデータが上書きされることに気付きました

また、フォーム応答 1 シートの C 列「プロジェクト番号」の下にあることに注意してください。フォーラム =ArrayFormula("MC"&TEXT(ROW(A2:A)-1 ; "000") ) があり、自動的に許可するように配置しました。プロジェクト番号で各提出物に番号を付ける

ARCHIVEスクリプトもあります-

プロジェクトが完成したら、列 G の「アーカイブ」の下に「DONE」と入力すると、ARCHIVE シートに移動します。

関数 onEdit() {

  // moves a row from a sheet to another when a magic value is entered in a column
  // adjust the following variables to fit your needs
  // see https://productforums.google.com/d/topic/docs/ehoCZjFPBao/discussion
  var sheetNameToWatch1 = "PROJECTS";
  var sheetNameToWatch2 = "ADVERTISING";
  var columnNumberToWatch = 7; // column A = 1, B = 2, etc.
  var valueToWatch = "DONE";
  var sheetNameToMoveTheRowTo = "ARCHIVE";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveCell();

  if ( (sheet.getName() == sheetNameToWatch1 || sheet.getName() == sheetNameToWatch2) && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
    sheet.deleteRow(range.getRow());
  }
}

問題 -コピー- フォームを使用して新しい提出物が入力されると、データは Form Responses 1 シートに入ってから PROJECTS シートにコピーされますが、各提出物は編集を上書きし、元のフォーム提出物データを取り込むため、PROJECTS の下のデータを編集することはできません-

私が望んでいるのは、データが Form Responses 1 シートに入ってから、提出ごとに PROJECTS シートにコピーされますが、新しい提出物が入ったときに上書きされず、PROJECTS の下のデータへの変更はそこにとどまることです。

問題 - プロジェクト番号- Form Responses 1 シートの下の列 C 行 2 の下に設定された数式 - 各行にはプロジェクト番号が割り当てられており、行がアーカイブ (「完了」) されて ARCHIVE に移動すると、PROJECTS シートにコピーされます。シートのその行に割り当てられたプロジェクト番号はそれに伴いますが、新しいプロジェクトを送信すると、同じ番号が新しいプロジェクトに適用される可能性があるため、最終的にすべてのプロジェクトをアーカイブすると、多くのプロジェクトが同じプロジェクト番号を持つことになります。方法はありますか?各プロジェクトに一意のプロジェクト番号を持たせるには?

*問題 - 送信フォーム * - 理由はわかりませんが、新しい送信が行われると、フォームの応答行の最後ではなく、毎回 113 行目にデータが送信されますか?

どんな助けでも大歓迎です-私はそれがうまくいくと思っていましたが、スクリプトは私がやりたいことに対して正しい設定ではないようです

どうもありがとう、パオラG

4

2 に答える 2

0

この種の状況をどのように処理するかに基づいた疑似手順を次に示します。

  1. スプレッドシートが編集されると onEdit トリガーが実行されます
  2. onEdit は、探している値の範囲をチェックします。値が一致する場合は、手順 3 に進みます。一致しない場合、スクリプトは何もしません。
  3. 値が探している値に変更された行番号を取得します。
  4. 停止したい列まで/含むその行の範囲を取得します。
  5. そのすべてのデータのコピーである配列 (またはオブジェクト) を作成します。
  6. その配列(またはオブジェクト)のデータである「完成した」スプレッドシートに「貼り付け」(新しい行を追加)します。
  7. 古いスプレッドシートの値を消去します。

ただし、フォームの回答は回答のスプレッドシートと密接に関連しているため、行を移動しようとしても、問題に対処する最善の方法ではありません。

実際、私はあなたがまったく移動すべきではないとあえて言います - 代わりに、「DONE」を探している行から値をコピーし、応答スプレッドシートでその行を非表示にするだけです. そうすれば、非表示になっていない行を「まだ完了させる必要がある」と考えることができ、完了したプロジェクト、「アーカイブ/データの整合性」の目的で応答スプレッドシートに表示されるだけでなく、「完了した行」にも表示されます。フォームの回答が変更されることを心配する必要なく、公開などを行うことができるスプレッドシート。

個人的には、大学の外国語学部のプロジェクト予約をスケジュールするためにこの戦略を使用しています。これにより、2 つのスプレッドシートを同時に管理するために必要な「余分な作業」が大幅に簡素化されます。代わりに、表示する必要のない値を非表示にして、重要事項の記録として機能する新しいスプレッドシートに投稿するだけで、スプレッドシートのレイアウトを編集できます。

PS - まだ気づいていない場合は、応答スプレッドシートの整合性を壊すことはできません。そうしないと、フォーム リンクが壊れてしまいます。実際、Google では、フォームにリンクされている応答スプレッドシートのレイアウトを変更する編集を行うことはできません。

于 2013-11-14T23:35:50.247 に答える