2016-09-02 3 views
1

私は先生です。私のクラスでは、学生一人につき1部ずつ、ブランクのグレーディングルークをコピーする必要があります。このルーブリックはGoogleのシートです。 (1)クラス名簿が入っている別のシートにアクセスし、(2)学生の名前を名簿から読んで、(3)生徒ごとに新しいスプレッドシートを作成し、生徒の名前で保存しますファイル名すべての作品(それは何らかの理由で非常に遅いですが、動作します)。スクリプト作成シートの名前をそのシートのセルに書き込む方法は?

今、私はその学生のルーブリックのコピーのセルに学生の名前を書き込もうとしています。私の考えは、元のルーブリックの関連するセルに生徒の名前を書いて、それを生徒の名前の下に保存することでした。しかし、その部分は機能しません。セル内の名前がファイル名と一致しません。代わりに、セル内の名前は、の前にの生徒の名前と一致します。ここでは、コードです:

function onerubricperstudent(){ 

//"roster" is the roster spreadsheet. Change the value in quotation marks to whatever your roster's ID is. 
    var roster = SpreadsheetApp.openById("1SN2x6bKzga6bRwwvt5diuaETBiXeHqY7bLJMY5If9js"); 

//"sheet" is sheet to be copied 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 

//range is the range on the roster sheet containing the student names 
    var range = roster.getRange('Sheet1!A1:A17'); 

//do this as many times as there are students in the class 
    for (var i = 1; i < 18; i++) { 

//get the next student name  
    var studentname = range.getCell(i, 1); 



//log the name (for troubleshooting if the script fails) 
    Logger.log(studentname.getValue()); 


//Write the student's name to the name cell on the sheet 

    sheet.getRange('B2').setValue(studentname.getValue()); 


//Make a copy of the sheet and save it with the student's name  
    DriveApp.getFileById(sheet.getId()).makeCopy(studentname.getValue()); 
    } 
} 

期待通りに動作しないラインがある:

sheet.getRange('B2').setValue(studentname.getValue()); 

私が間違って何をしているのですか?

注:

function onOpen() { 
    var sheetname = SpreadsheetApp.getActive().getName(); 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    sheet.getRange('B2').setValue(sheetname); 

}

:回避策として、私は学年に学生の作品をルーブリックを開いてコピーし、生徒名のセルにシート名をこの開く時のスクリプトを追加しましたこれは仕事を終わらせますが、元のコードの何が間違っているかを知りたいです。

ありがとうございます!

答えて

2

スクリプトはセルB2の値を正常に設定しますが、スプレッドシートのコピーには保留中の変更は含まれません。保留中の変更をforループ内にコピーするには、SpreadsheetApp.flush()を呼び出す必要があるようです。保留中のスプレッドシートの変更がすべて適用されます(see docs on flush())。ここで

はいくつかのコードです:

function onerubricperstudent(){ 

    var roster = SpreadsheetApp.openById("YOUR-ROSTER-SHEET-ID-HERE"); 
    var rubricSheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var rubricFile = DriveApp.getFileById(rubricSheet.getId()); 

    // replace the worksheet name and desired range with your name/range below 
    var range = roster.getRange('Roster Master!A2:A21'); 
    var studentNames = range.getValues(); 

    for (var i = 0; i < studentNames.length; i++) { 
    rubricSheet.getRange('B2').setValue(studentNames[i]); 

    // SpreadsheetApp.flush() "forcefully" applies all pending Spreadsheet changes. 
    SpreadsheetApp.flush(); 

    rubricFile.makeCopy(studentNames[i]); 
    } 
} 

またDriveAppでコピーを作成することが遅いらしいことに注意してください。それも私の経験です。残念ながら、私はこれを最適化することはできないと思っています(誰かがヒントを持っていれば、それを見るのはすばらしいでしょう)。これに関するもう1つの質問がここにあります:Google Apps Script : copying spreadsheet is very slow(しかし答えは非常に有用ではありません)。

ここにオプションがあります:個別のスプレッドシートファイルが必要ない場合は、同じスプレッドシート内に新しいシートを作成することを検討してください。これは、とかなり大きくなります速くなります。

function onerubricperstudent(){ 

    var roster = SpreadsheetApp.openById("YOUR-ROSTER-SHEET-ID-HERE"); 
    var rubricSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var rubricFile = DriveApp.getFileById(rubricSpreadSheet.getId()); 

    // replace the sheet name with the name of the sheet you want to use as a template 
    var templateSheet = rubricSpreadSheet.getSheetByName("Rubric Master"); 

    var range = roster.getRange('Roster Master!A2:A4'); 
    var studentNames = range.getValues(); 

    for (var i = 0; i < studentNames.length; i++) { 
    var newSheet = rubricSpreadSheet.insertSheet(studentNames[i], i+1, {template: templateSheet}) 
    newSheet.getRange('B2').setValue(studentNames[i]); 
    } 
} 
+0

ブリリアント:ここ

はいくつかのコードです! 'Spreadsheetapp.flush()'がトリックを行いました。また、あなたのコードは私のものよりも、よりリーンでエレガントです(これはスクリプト作成の2回目または3回目の試みです;私は多くのことを学ぶ必要があります)。あなたの助けをありがとう。 – murph

+0

@murph - 援助できることを嬉しく思います:) – Will

関連する問題