3

これは、昨日Google Apps Script OfficeHoursHangoutで尋ねた質問のフォローアップです。

私の最終的なスクリプトの目標は、Googleフォームを使用して作業している高校での学生選挙の選挙プロセスを作成することです。スクリプトには3つの部分があります。1)一意の「投票ID」(ランダムな6桁のコード)を作成します。2)学生データ(名前、担任、投票ID)を、それぞれに特定の投票指示を作成するテンプレートドキュメントとマージします。学生。(つまり、昔ながらのメールマージ)3)投票IDを確認し、重複する投票を削除して、結果を確認します。

私が問題を抱えているスクリプトの部分は、生徒のデータのマージです(ステップ2)。最初のデータセットが機能する唯一のデータセットです。残りは「DocumentBodySection」として表示されます。ドキュメントテンプレートからテキストをコピーする方法か、新しいドキュメントにテキストを追加する方法のどちらかだと感じています。

データ付きスプレッドシート: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();
  }
4

3 に答える 3

3

テンプレートのコピーを作成し、テキストを置換してから、元のドキュメントのテンプレート要素をコピーに追加することで、この問題を回避しました。特に、私は以下を使用しました:var copyTables = templateDoc.getTables();テーブルを取得して保存し (すべてのテンプレート データがテーブルに含まれていたため) copyDoc.appendTable(copyTables[0].copy() );、コピーを追加し.copy()ました (最後に は本当の魔法が働いているようです)。これにより、プログラマーに会わなくても、使いやすい Documents インターフェイスでテンプレートを柔軟に更新できます。

于 2012-09-27T16:46:48.023 に答える
0

appendText(entryTemplate) はあなたがやりたいことをしないというエリックに同意します。

生徒全員で 1 つの大きなドキュメントを作成しようとしているので、「テンプレート」を使用してテキストを置き換えるのはうまくいきません。代わりに、必要なフォーマットを生成する API 呼び出しを使用してコードで「テンプレート」を作成することをお勧めします。次に、生徒の指示の新しいページを追加し続けることが簡単になります。ドキュメントが大きくなると速度が遅くなると思いますが... 何人の学生がいるかわかりません。

于 2012-05-14T00:03:18.077 に答える
0

問題はこの行にあると思います:

docText.appendText(entryTemplate);

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

于 2012-05-11T13:55:21.510 に答える