2017-01-12 9 views
1

だから、私は4日前にJavascriptを学習し始めたと言って始めます。それでは、このスクリプトの私の意図は途方に暮れています。週ごとに新しいシートにフォーム応答をコピーして保存するGoogleスクリプト

スプレッドシートで収集されたGoogleフォームレスポンスをアーカイブと同じブック内の新しいシートに移動するプロセスを自動化したいと思います。

私はこれを週単位で、そして1週間の応答しかないように作成された各アーカイブシートに対して実行したいと思います。これは日曜の午前12時01分〜午前1時00分の間でなければなりません。

プライマリコレクションシート(Current_Responses)からそれらの応答をすべて削除することもできますが、後で手動で削除する必要がある場合は、うまくいきます。 )。

私はこれをやっていてかなり前向きなスタートを切っているように感じますが、これに新しいので、経験豊富なスクリプタが私のコードを見て、意図していない場合は、間違いはどこにあり、どのように修正するのか。私は間違いを犯して喜んで、そしてそれらから学ぶので、どんな助言も深く尊敬されるでしょう。

これをまとめるために、3つのWebサイトでいくつかのトピックとスクリプトを調べました。助けやアドバイスをいただき、ありがとうございます。

// function to copy from Current_Responses to new sheet 'Archived_Responses 
//(UTC Date)' placed after Current_Responses 
function CreateCopySheetWeekly() { 

    //source info 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var templateSheet = ss.getSheetByName('Current_Responses'); 
    var range = ss.getRange ('A:I'); //replace column length as needed 
    var data = range.getValues(); 

    //creates target sheet to copy responses to 
    var ts = 'Archived_Responses '+formatDate(); 
    ss.insertSheet(sheetName, ss.getSheets().length, {template: templateSheet}); 
    ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length).setValues(data); 
} 
//end of primary function 

//function to determine and format UTC Date for CreateCopySheetWeekly function 
function formatDate() { 
    var month, day, d = new Date(); 
    month = ('0'+(d.getUTCMonth()+1)).slice(-2); 
    day = ('0'+(d.getUTCDate()).slice(-2); 
    return d.getUTCFullYear()+'-'+month+'-'+day; 
} 
//end of date function 

//check every hour to determine when to perform newSheetLast function. Intended for Sunday 
//between 0001-0100 
window.setInterval (onSunday(){ 
    var today = new Date(); 
    if (today.getDay() == 0 && today.getHours() === 12) { 
    CreateCopySheetWeekly(); 
}, 600000); 

私はこれで初めてですから、簡単に移動しますが、建設的な批判は決して誰にも害を与えません。

答えて

0

これを1週間に1回実行すると、すべての応答を週に1回バックアップし、メイン応答シートをクリアするという簡単な前提ができます。

機能を段階的に進んで最適化しましょう。

最初にすべての行を取得していますが、すべてのデータが必要な場合は、ただちにgetDataRange()とすることができます。 また、実際のデータは必要ありません。あなたは

var ts = 'Archived_Responses '+ new Date().toISOString().slice(0,10); 

を機能を削除し、代わりに使用することができますので、私が正しく理解していれば

function CreateCopySheetWeekly() { 

    //source info 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var templateSheet = ss.getSheetByName('Current_Responses'); // Current Responses 
    var range = ss.getDataRange(); 

formatDate()は、ちょうど現在の日付のISO8601表現を作成しているテンプレートを使用してシートを挿入し、既にコピーし、すべてのデータをあなたのようにのみ必要

ss.insertSheet(ts, ss.getSheets().length, {template: templateSheet}); 

次に、メインの応答シートをクリーンアップします。
範囲をクリアするだけで、最後の行の後にフォームが追加されたままになる場合は、返されたレスポンスの数が記憶されているためクリアされていない場合はヘッダー以外のすべての行を削除する必要があります。

最終スクリプト

function CreateCopySheetWeekly() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var templateSheet = ss.getSheetByName('Current_Responses'); 
    var range = ss.getDataRange(); 
    var ts = 'Archived_Responses '+ new Date().toISOString().slice(0,10); 

    ss.insertSheet(ts, ss.getSheets().length, {template: templateSheet}); 
    templateSheet.deleteRows(2, range.getNumRows() - 1); 
} 

最後にあなたは>リソースに行くことによって現在のプロジェクトのトリガーのそれをスケジュールし、トリガをベースと時間を設定することができますを作る

templateSheet.deleteRows(2, range.getNumRows() - 1); 

関連する問題