2016-09-06 79 views
0

我已經寫了下面的代碼來實現自定義Google Spreadsheet函數;我們的目標是編寫團隊,其名稱在「名稱」參數列之間的所有可能的遊戲:爲什麼此自定義Google Spreadsheet功能不起作用?

function ALLGAMES(names) 
{ 
    var nbTeams = names.length; 
    var gameList = []; 

    for(var t1=0; t1<nbTeams-1; t1++) { 
     for(var t2=t1+1; t2<nbTeams; t2++) { 
      gameList.push([ new String(names[t1]), new String(names[t2]) ]); 
      //A. gameList.push([ t1, t2 ]); 
     } 
    } 

    // B. return JSON.stringify(gameList) 
    // C. return [[ 'a', 'b' ], ['c', 'd']]; //using the value returned by JSON.stringify 
    return gameList; 
} 

當我在電子表格中使用函數,它填補細胞空白值而不是球隊的名字。

然而,預期在下列任何情況下的行爲:

  • 如果我使用A.行(推號代替字符串),它會顯示所有正確的數字
  • 如果我使用B.行(返回數組的JSON字符串),它將顯示正確的JSON字符串
  • 如果我使用C.行(完全返回數組),它將按預期工作。

問題在哪裏?

編輯1:

這裏是調用ALLGAMES我做測試功能: Google Spreadsheet call to custom function ALLGAMES

+0

在推送調試問題之前,我會建議打印(記錄)新字符串(名稱[t1]),新字符串(名稱[t2]) – Eugene

+0

添加用於調用自定義函數的公式。如果您使用參考作爲參數,請添加參考值。 –

+0

@Eugene日誌顯示正確的字符串,這與我取消註釋行B並獲取數組的JSON字符串的情況一致。 – Silverspur

回答

2

的ALLGAMES功能將收到來自您的選擇二維數組。您應該先將其映射到一維數組中。 在循環中,你應該忽略新的String(..)。在JavaScript你幾乎從來不使用這個符號,看this discussion

function ALLGAMES(names) 
{ 
    names = names.map(function(item) { return item[0]; }); // adjusted 

    var nbTeams = names.length; 
    var gameList = []; 

    for(var t1=0; t1<nbTeams-1; t1++) { 
    for(var t2=t1+1; t2<nbTeams; t2++) { 
     gameList.push([ names[t1], names[t2] ]); // adjusted 
    } 
    } 

    return gameList; 
} 
+0

對我來說,當使用調用'ALLGAMES'的'test'函數時也是如此。但直接從電子表格中使用'ALLGAMES'時,這仍然不起作用,這正是我想要的。 – Silverspur

+0

我給了我的答案一個更新,現在它也直接從電子表格中工作。 –

+0

Arf的確如此。我認爲'名稱'數組是單維的...我的壞。 – Silverspur

1

簡短的回答

通過

gameList.push([names[t1][0], names[t2][0]]) 

說明更換

gameList.push([ new String(names[t1]), new String(names[t2]) ]); 

作爲自定義函數的參數傳遞的範圍引用被解析爲二維數組,因此可以使用引用[i] [j]而不是引用[i]。另一方面,new String(string)會返回一個對象,但自定義函數應返回值,否則Google表格無法正確顯示結果。

相關問題