2017-07-30 4 views
-1

Googleフォームの情報がダンプされるGoogleシートがあります。 2つの列が日付範囲(列CとG列)を作成し、範囲の各日付の新しい情報行をシートが自動的に作成し、元の行の他のすべての情報をすべての行作成した。最終的には、範囲内のすべての日付は、2日または25日であるかどうかにかかわらず、独自の行を持ち、フォームを通じて収集されたすべての情報は毎日表示されます。列Gに日付がない場合は、1日の旅行に過ぎず、追加の行は必要ありません。誰かがフォームを送信するときに物事をより困難にするために、情報は最後に入力した行の直下の行に入力されるので、日付範囲で埋められたこれらの新しい行はシートを下ろす必要があります。このシートは数ヶ月で多くの情報を持っているため、サンプルに表示されるように、すべての並べ替えを実行する別のシートがブックにあります。助けてくれてありがとう。Googleシート#2の日付範囲内の行を追加し、毎日元の行の情報をコピーする

Sample Document

+0

フォームにリンクされているシートだけを残しておく方がよいと思います。それで何もしないでください。あなたの提出物を保管するのは良い場所です。フォーム提出を取得したら、onFormSubmitトリガーを使用して新しい行を別のシートに追加します。私は私のResponseReviewと呼んだ。すべての新しいデータがちょうど底に追加されるので、あなたはそれで必要なことをすることができます。どう思いますか?あなたはそれをしたいですか? – Cooper

+0

私は一番簡単な解決策だと思います。私に何をすべきか教えてください。私はあなたの髪の毛から脱出します。共有されたファイルはコピーですので、あなたが思っていることは何でも構わないと思います。私は元のファイルを読んでいます。ありがとう –

答えて

0

フォームイベントを提出し、それに次のコードをアタッチを作成する必要があります。また、シート名 'ResponseReview'を作成する必要があります。

function formSubmitEvent1(e) 
{ 
    var ss=SpreadsheetApp.openById('SpreadsheetID'); 
    var sht=ss.getSheetByName('ResponseReview'); 
    sht.appendRow(e.values); 
} 

上記のコードでは、openByIdメソッドにSpreadsheetIdが必要です。このコードは、ResponseReviewシートの最後に新しい行を追加します。

次のコードは、3列目と7列目の日付を持つエントリを展開し、その最初の行から7列目の終了日も削除します。私は、列3が空でなく、列7がなく、列7が列3と等しくなければ、それは展開する必要がある行であるという事実を使用します。だから私は、それが将来再び実行されるときに展開され続けるように終了日を削除する必要があります。もしあなたが終了日よりも保つ必要があるならば、何か他のものを見つけ出すことができます。最後に列を展開しないでください。

function convertRangetoRows() 
{ 
    var ss=SpreadsheetApp.getActive(); 
    var sht=ss.getSheetByName('ResponseReview'); 
    var rng=sht.getDataRange(); 
    var rngA=rng.getValues(); 
    var rngB=[]; 
    var day=86400000; 
    rngB.push(rngA[0]); 
    for(var i=1;i<rngA.length;i++) 
    { 
    rngB.push(rngA[i]); 
    if(rngA[i][2] && rngA[i][6] && rngA[i][2]!=rngA[i][6]) 
    { 
     var row=rngA[i].slice();//returns a new copy of the array by value 
     rngA[i][6]='';//deletes the end date by reference so it also deletes the one thats already been pushed into rngB 
     var dt0=new Date(row[2]); 
     var dt1=new Date(row[6]); 
     var days=(dt1.valueOf()-dt0.valueOf())/day; 
     var dt=dt0.valueOf(); 
     for(j=0;j<days;j++) 
     { 
     dt+=day; 
     row[2]=Utilities.formatDate(new Date(dt), Session.getScriptTimeZone(), "MM/dd/yyyy");//original array unchanged 
     row[6]='';//original array unchanged 
     rngB.push(row.slice());//push in a copy 
     } 
    } 
    var intermediate='nothing'; 
    } 
    var outrng=sht.getRange(1,1,rngB.length,rngB[0].length); 
    outrng.setValues(rngB); 
    var end='the end is near'; 
} 

これは私のスプレッドシートは、拡張機能実行する前に、次のようになります。

enter image description here

以降を:

enter image description here

そして今、あなたがにリンクされているシートを残すことができますフォームを単独で送信し、提出されたデータのアーカイブにします。

+0

@Saket slice()を使用して配列を値渡しすることについての情報をありがとう。 – Cooper

+0

私はこのダム感覚が嫌い!あなたの指示に従おうとしているときにエラーが発生しました: 'TypeError:プロパティ "値"を未定義から読み取ることができません。 (行5、ファイル "コード")。ここに実際のスプレッドシートへのリンクがあります。あなたの魔法を働かせてから、私は共有しないで覚えてみましょう... https://docs.google.com/spreadsheets/d/1Pq_jlzMMvKY99HGc9iFrxjXshkZc2lb4Vde0YsFQc-c/edit?usp = sharing –

+0

この関数を実行することはできません。関数formSubmitEvent1(e) { var ss = SpreadsheetApp.openById( '1Pq_jlzMMvKY99HGc9iFrxjXshkZc2lb4Vde0YsFQc-c'); var sht = ss.getSheetByName( 'ResponseReview'); sht.appendRow(e.values); } 'と入力します。あなたはそれをonFormSubmitトリガーに接続する必要があります。トリガーがなければ、イベントはないので、event.valuesは定義されていません。 eパラメータは、イベントオブジェクトを表します。 – Cooper