2012-05-10 67 views
3

這是我昨天就Google Apps Script Office Hours Hangout提出的問題的後續活動。使用Google Apps腳本創建「老式」郵件合併問題

我最終腳本的目標是在高中,我的工作使用谷歌形式來爲學生創造一個選舉的選舉過程。該腳本有三個部分:1)創建獨特的「投票ID」(一個隨機的6位代碼)2)合併學生數據(姓名,本室,&投票ID)與模板文件,將創建具體的投票指令學生。 (即舊式郵件合併)3)通過檢查投票ID並刪除重複投票來驗證結果。

,我遇到的麻煩腳本的一部分是學生數據合併(步驟2)。第一個數據集是唯一可用的數據集。其餘顯示爲「DocumentBodySection」。我有一種感覺,那就是我如何複製文檔模板中的文本,或者我如何將文本添加到新文檔中。

電子表格W /數據:https://docs.google.com/spreadsheet/ccc?key=0AierVcXWELCudFI1LU10RnlIVHNsUm11a0dDWEV6M1E

文檔模板:(參見網址後續評論)

文檔創建者腳本: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();獲取並存儲表(所有我的模板數據被包含在一個表)和copyDoc.appendTable(copyTables[0].copy());追加的副本(.copy()末似乎工作真正的魔法)。這提供了在友好的文檔界面中更新模板的靈活性,而無需查看程序員。

0

我認爲這個問題是這一行:

docText.appendText(entryTemplate); 

變量entryTemplate擁有一個DocumentBodySection,這就是爲什麼你在輸出中看到它的原因。如果您試圖附加原始模板文本的另一個副本,則需要在進入循環之前將其存儲起來。

+0

我_think_我明白你在說什麼,但是,原始模板文本包括DocumentBodySection。也許這是我的問題。有沒有辦法在不包含DocumentBodySection的情況下複製文檔中的所有文本(包括格式)?現在,我使用這行代碼複製了文本'var entryTemplate = docTemplate.getActiveSection();'。 –

+0

完全使用不同的方法可能會更好。而不是試圖讓一個文件包含所有的替代品,那麼每個學生有一個新的文檔呢?或者直接從Apps Script發送電子郵件? –

+0

最終目標是打印出1份文件。我很樂意通過電子郵件發送說明,但我們的學區不允許學生收到電子郵件。 也許我想做的事情是不可能的。 –

0

我和Eric同意AppendText通過(entryTemplate)是不會做你想要它做的事情。

既然你想創建與所有的學生一個大的文件,使用「模板」和替換文本是不會工作。我會建議,在代碼中使用產生所需格式的API調用創建「模板」。然後,可以很簡單地繼續追加新的學生指示頁面。儘管我認爲當文件變大時你可能會陷入緩慢......我不知道你有多少學生。

+0

我原本以這種方式考慮過,但是因爲我認爲最終用戶創建模板文檔會更容易。由於這不起作用,我將開始使用用腳本創建整個文檔的想法。 @mzimmerman我會在約1200名學生上運行這個。你覺得這太多了嗎? –

+0

這是Google文檔中的1200頁。確保打開文檔時瀏覽器的性能會很慢。也許一次將它們分成100頁的批次。 – mzimmerman

+0

好的。我實際上會在每頁上放2-3個「學生」,所以它會比較小。我還沒有檢查(我正在穿越我的手指),但我希望應用腳本可以讓我添加分頁符。我最擔心的是我的腳本會超時。我想沒有嘗試就無法知道這一點。 –