2016-09-19 7 views
0

私は多数のフォーム(クイズ)からフォームレスポンスシートを持っているスプレッドシートを持っています。すべての書式に同じ書式、数、質問の順序が含まれているので、それらをすべて1枚のシートにまとめたいと思います。多数のフォーム応答シートを1つのマスターシートにマージする方法。 (Googleスプレッドシート)

これはクエリ({sheet1!range、sheet2!range ...})を使って行うことができますが、このクエリのサイズは膨大になります(25種類以上あります)私は新しいフォームを追加するたびにこの数式で回ります。

私が最初に調査したのは、範囲内のシートのリストを作成してから間接的にそのリストを実行するarrayformulaクエリを取得しようとしたことです。しかし、これはうまくいかず、このフォーラムに依頼した後、それはできないと言われました。

私はスクリプトを調べて、週末にこれを行うことができるスクリプトを見つけようとしていました。しかし、私は失敗しました。

フォームレスポンスシートの最後の行をマスターシートの下部にコピーするスクリプトが必要です。私はスクリプトにすべての応答シート(これはスクリプトに組み込むシートを簡単に見られるようにするためのシートの命名形式があります)にこれを行うようにしたいと思います。私はonSubmit()関数を使う必要があるとは思いますが、わかりません。

+1

これまでに何を試みましたか?コードを投稿できますか?この問題を解決するには、この[[最小限の完全で検証可能な例の作成方法]](http://stackoverflow.com/help/mcve)を確認してください。 – abielita

答えて

1

概要

私が関与するいくつかのフォームや回答が多数存在するためにトリガーを提出し使用することは良い考えであるとは思いません。一方、いくつかの回答が非常に近く提出されれば、紛争になる可能性があります。 IMHOより良いアプローチは、スクリプトをデマンド(手動)で実行するか、time-driven triggerを使用することです。 Google Appsのスクリプトの実行時間として

ではなく、私はより良いアプローチは、マスターシートをクリアして、一度にすべてのシートの応答を追加することだと思い新しい応答の各シートをチェックする、6分1を超えないようにしてください。注釈、コメント、カスタムフォーマット、データ検証、またはデータ変更がマスターシートに直接適用されない場合、これは機能します。以下は、スクリプト

は、「マスター」という名前のシートに同じスプレッドシートにあるフォームの回答シートの内容を結合するスクリプトです。それは簡単に適応することができる、と私は思います。

スプレッドシートには、フォーム応答シートと「マスター」シートしか含まれていないものとします。

/** 
* Joins the data from form responses sheets on a master responses sheet. 
* Assumes that the master sheet has the form response headers and 
* that there aren't extra columns. 
*/ 

function joinSheetsData() { 
    // Initialize loop variables 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheets = ss.getSheets(); 
    var masterName = 'Master';        // Change this. 
    var masterSheet = ss.getSheetByName(masterName); 
    var headers = [masterSheet.getDataRange().getValues()[0]]; 
    var masterdata = []; 

    // Loop to append form responses from all response sheets to one array. 
    for(var i = 0; i < sheets.length; i++){ 
    if(sheets[i].getName() != masterSheet.getName()){ 
     var data = sheets[i].getDataRange().getValues(); 
     data.splice(0,1); 
     masterdata = append(masterdata,data); 
    } 
    } 
    // Clear the master sheet. 
    masterSheet.clear(); 
    // Add the headers to the master sheet. 
    var masterheadersRow = masterSheet.getRange(1, 1, 1, 
    masterdata[0].length); 
    masterheadersRow.setValues(headers); 
    // Send the resulting array to the master sheet. 
    var masterdataRange = masterSheet.getRange(2, 1, masterdata.length, 
    masterdata[0].length); 
    masterdataRange.setValues(masterdata); 
} 

/* 
* Auxiliary function to append 2D arrays. 
*/ 
function append(a,b){ 
    for(var i = 0; i<b.length; i++){ 
    a.push(b[i]); 
    } 
    return a; 
} 

+0

こんにちはRuben、ありがとうございました。いくつか確認できますか:1)フォームレスポンスでないシートやスプレッドシートからマスターシートを削除する必要がありますか、フォームレスポンスシートのみを取りますか? 2)どうすればこの機能を起動できますか?どのくらいの頻度で更新されますか?再度、感謝します! John – TranquilityEden

+0

@ user3106771:私は解明要求に答えるために私の答えに「overview」セクションを追加しました。 –

関連する問題