2014-12-23 94 views
0

我已經編寫了一些腳本,用於從電子表格表中讀取數組(響應 - 多行和多列),將數據從每行提取到一行或兩行(條目)中一個'main'數組,然後將'main'數組寫入不同的工作表。響應的每一行都可以包含一個或兩個條目 - 以標記值顯示。將數組寫入電子表格

工作正常,但只有最後一個條目被粘貼到第二張紙上正確的行數。

某處我沒有將每個對象的值放入Entry數組中,只是對該值的引用,但看不到我出錯的地方。

電子表格是 https://docs.google.com/spreadsheets/d/1x-HO7KIAQ_s7q55opTd2LRpRRo95S1CqeH193RalWS0/pubhtml

和我的腳本如下:

function transferResponses() { 
// establish sheets 
    var aFile = SpreadsheetApp.getActiveSpreadsheet(); 
    var aResponseSh = aFile.getSheetByName("Form responses 1"); 
    var aBaseSh = aFile.getSheetByName("Base"); 

// check number of response 
    var numResponses = aResponseSh.getLastRow() - 1; 
// put responses in an array 
    var aResponses = aResponseSh.getSheetValues(2, 1, numResponses, 23); 

// define other variables to use 
    var oneEntry = [];  // array for a single entry 
    var aEntries = [];  // array of all entries 
    var aNumber;   // increment part of ID 

// counters, etc 
    var iRes; 
    var iCol; 
    var iEntry = 0; 

    for (iRes = 0; iRes < numResponses; iRes++) {  
    aNumber = iEntry + 101; 
    oneEntry[0] = "A" + aNumber.toString();  // form and load entry ID 
    for (iCol = 1; iCol < 12; iCol++) {   // load name, surname, address 1, address 2,  phone, email 
     oneEntry[iCol] = aResponses[iRes][iCol];  // and first entry title, classification,  size, description, price 
    } 
    oneEntry[12] = aResponses[iRes][18];   // load novice status 
    oneEntry[13] = aResponses[iRes][21];   // load date of entry 
    oneEntry[14] = aResponses[iRes][22];   // load method of payment 

    aEntries.push(oneEntry.valueOf());    // push entry (oneEntry) into main aray  (aEntries) 

    iEntry = iEntry + 1;       // increment single entry counter 

    if (aResponses[iRes][12] === "Add another entry") {  // check for a second entry on  response 
     aNumber = iEntry + 101; 
     oneEntry[0] = "A" + aNumber.toString();  // form and load entry ID 
     for (iCol = 1; iCol < 7; iCol++) {    // load name, surname, address 1, address 2,  phone, email 
     oneEntry[iCol] = aResponses[iRes][iCol];  // and first entry title, classification,  size, description, price 
     } 
     for (iCol = 7; iCol < 12; iCol++) {   // and second entry title, classification,  size, description, price 
     oneEntry[iCol] = aResponses[iRes][iCol + 6]; 
     } 
     oneEntry[12] = aResponses[iRes][18];   // load novice status 
     oneEntry[13] = aResponses[iRes][21];   // load date of entry 
     oneEntry[14] = aResponses[iRes][22];   // load method of payment 

     aEntries.push(oneEntry.valueOf());    // push entry (oneEntry) into main aray  (aEntries) 

     iEntry = iEntry + 1;       // increment single entry counter 
    } 
    } 

    lastRow = aBaseSh.getLastRow(); 
    if (lastRow > 1) {        // clear all existing data on base sheet 
    aBaseSh.deleteRows(2, lastRow); 
    } 

    aBaseSh.getRange(2, 1, aEntries.length, aEntries[0].length).setValues(aEntries); // paste  main array (aEntries) 

} 
+0

嘗試將循環值更改爲:for(iRes = 0; iRes <= numResponses; iRes ++) – KRR

+0

感謝KRR,但這只是試圖讀取數組aResponses的末尾。 – peterjim

回答

0

在每個陣列試試這個每個等號後:

oneEntry[iCol] = aResponses[iRes][iCol].slice(0); 

,或者如果只有一個串:

oneEntry[iCol] = aResponses[iRes][iCol].valueOf; 

而且,你的問題是不特定的,書寫一個數組的電子表格是一個非常普通的一個,並沒有任何與你的錯誤,至極由陣列參考而不是克隆,你的問題引起的也應該儘量減少,同時仍然重現錯誤。

+0

Kriggs,感謝您的評論 - 「引用而不是克隆」讓我能夠解決問題。錯誤在於當推送數組時使用.valueOf()而不是.slice()。 – peterjim

相關問題