2012-05-10 16 views
3

これは、昨日Google Apps Script Office Hoursハングアウトで質問した質問のフォローアップです。Google Apps Scriptで「旧式」の差し込み印刷を作成する問題

私の最終的なスクリプトの目標は、私がGoogleフォームを使用している高等学校で学生選挙のための選挙プロセスを作成することです。スクリプトには3つの部分があります:1)ユニークな「投票ID」(ランダムな6桁のコード)を作成する2)生徒データ(名前、Homeroom、&投票ID)をテンプレート文書にマージし、学生。 (旧式の差し込み印刷)3)投票IDを確認し、重複票を削除して結果を確認します。

私が問題を抱えている部分は、学生データのマージ(手順2)です。最初のデータセットだけが動作します。残りは "DocumentBodySection"として表示されます。ドキュメントテンプレートからテキストをコピーする方法、または新しいドキュメントにテキストを追加する方法がわかっています。

スプレッドシートのデータ/ W:https://docs.google.com/spreadsheet/ccc?key=0AierVcXWELCudFI1LU10RnlIVHNsUm11a0dDWEV6M1E

ドキュメントテンプレート:スクリプトによって作成

文書を(URLのフォローのコメントを参照してください):https://docs.google.com/document/d/12r2D9SpIVmQYVaasMyMWKjHz6q-ZZyIMEBGHTwlQct8/edit

//Get Settings & Data 
ss = SpreadsheetApp.getActiveSpreadsheet(); 
source_sheet = ss.getSheetByName("Student Data"); 
settings_sheet = ss.getSheetByName("SETTINGS"); 
results_column = settings_sheet.getRange("B19").getValue(); 
source_column = settings_sheet.getRange("B18").getValue(); 
source_lastrow = source_sheet.getLastRow(); 
docTemplateID = settings_sheet.getRange("B13").getValue(); 
docCopyName = settings_sheet.getRange("B14").getValue(); 

//Merge Student Data with Document 
function SendDataMerge() { 
    // Open docTemplate and Copy Contents to entryTemplate 
    var docTemplate = DocumentApp.openById(docTemplateID); 
    var entryTemplate = docTemplate.getActiveSection(); 
    docTemplate.saveAndClose(); 
    // Make a NEW copy of docTemplate 
    var docTemplate = DocsList.getFileById(docTemplateID); 
    var docCopy = DocsList.copy(docTemplate, docCopyName); 
    var docCopyID = docCopy.getId(); 
    // Create Array of Student Data (First, Last, Grouping, VID) 
    var data = source_sheet.getRange("A2:D"+source_lastrow).getValues(); 
    // Open docCopy for Editing & Clear Contents 
    var doc = DocumentApp.openById(docCopyID); 
    var docText = doc.editAsText(); 
    // Run through Student Data 
    for(var i=0; i<5 /*data.length*/; i++) { //For testing, limit this to 5 entries 
     var lastName = data[i][0]; 
     var firstName = data[i][1]; 
     var grouping = data[i][2]; 
     var vid = data[i][3]; 
     docText.replaceText('keyLastName', lastName); 
     docText.replaceText('keyFirstName', firstName); 
     docText.replaceText('keyGrouping', grouping); 
     docText.replaceText('keyVID', vid); 
     docText.appendText('\n*** Appended Text (End of entry) ***'); 
     docText.appendText(entryTemplate); 
    } 
    // Save and Close 
    doc.saveAndClose(); 
    } 
+0

ドキュメントテンプレート:[リンク](https://docs.google.com/document/d/1BdYkmHFzXcgiTVf4Hu6YsVlt20lpCLh9JR8LHMd9itk/edit) –

答えて

3

私はこの問題を回避するために、テンプレートのコピーを作成し、テキスト置換を行い、元のドキュメントのテンプレート要素をコピーに追加しました。特に、私はvar copyTables = templateDoc.getTables();を使用してテーブルを取り込み、テーブルに格納しています(.copy()は実際の魔法のように見えます)。copyDoc.appendTable(copyTables[0].copy());これにより、フレンドリなドキュメントインタフェースでテンプレートを更新する際に、プログラマに頼らずに柔軟に対応できます。

0

私は問題はこのラインであると思います:

docText.appendText(entryTemplate); 

可変エントリテンプレートDocumentBodySectionを保持しています。そのため、出力でそれを確認しています。元のテンプレートテキストの別のコピーを追加しようとする場合は、ループに入る前にそれを保存する必要があります。

+0

私は私はあなたが言っているのか理解_think_は、しかし、元のテンプレートのテキストがDocumentBodySectionが含まれています。多分これは私の問題です。 DocumentBodySectionを含めることなく、文書内のすべてのテキスト(書式を含む)をコピーする方法はありますか?今、私はこの行を使ってテキストをコピーしています。 'var entryTemplate = docTemplate.getActiveSection();'。 –

+0

別のアプローチを使用する方が良いかもしれません。すべての置換えを含む1つのドキュメントを作成するのではなく、学生1人につき1つの新しいドキュメントを作成するのはどうですか?またはApps Scriptから直接メールを送信するだけでもいいですか? –

+0

最終的な目標は、印刷可能な1つの文書を持つことです。私は電子メールで指示を送るのが好きですが、私たちの地区では生徒に電子メールを送ることを許可しません。 私がしたいことは多分できません。 –

0

私はappendText(entryTemplate)があなたがしたいことをするつもりはないとEricに同意します。

すべての生徒と1つの大きな文書を作成しようとしているので、「テンプレート」を使用してテキストを置き換えてもうまく機能しません。代わりに、私が望む書式を生成するAPI呼び出しを使用してコード内に「テンプレート」を作成することをお勧めします。そうすれば、学生の指示の新しいページを追加し続けるのが簡単になります。文書が大きくなると遅くなるかもしれませんが...あなたは何人の生徒がいるのか分かりません。

+0

私はもともとこのようにすることを考えていましたが、エンドユーザーがテンプレート文書を作成する方が簡単だと思っていたので、反対しました。これはうまくいかないので、スクリプトを使って文書全体を作成するという考え方で演奏を開始します。 @mzimmerman私は約1200人の学生にこれを実行します。これが多すぎると思いますか? –

+0

これはGoogleドキュメントの1200ページです。ドキュメントを開くときはブラウザのパフォーマンスが遅くなります。一度に100ページのバッチに分けてください。 – mzimmerman

+0

私は実際に2-3の "学生"を各ページに載せるつもりですので、かなり小さくなります。私はまだチェックしていない(私の指を横切っている)が、私はアプリのスクリプトがページ区切りを加えることを望んでいると思っている。私の最大の心配は、私のスクリプトがタイムアウトすることです。私はそれを試さずにこれを知る方法がないと思う。 –

関連する問題