2013-03-21 103 views
2

我目前正在用Google Spreadsheet设置一个决策矩阵,并且我想实现结果的排名功能。我不会做,如果只有4个选项,但对我来说也有像可用32个选项...Google电子表格排名值

我试图与谷歌脚本API要做到这一点,但结果是令人失望的有点:

function Ranking() { 
var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
var alldata = sheet.getDataRange().getValues(); 
var data = []; 
var j = 8; 
for (var i = 0; i <= 31; i++) { 
data [i] = alldata[18][j]; 
j= j+2; 
} 
var sorted = data.slice().sort(function(a,b){return b-a}); 
var ranks = data.slice().map(function(v){return sorted.indexOf(v)+1}); 
sheet.getRange("I20").setValue(ranks[0]); 
sheet.getRange("K20").setValue(ranks[1]); 
sheet.getRange("M20").setValue(ranks[2]); 
sheet.getRange("O20").setValue(ranks[3]); 
sheet.getRange("Q20").setValue(ranks[4]); 
sheet.getRange("S20").setValue(ranks[5]); 
sheet.getRange("U20").setValue(ranks[6]); 
sheet.getRange("W20").setValue(ranks[7]); 
sheet.getRange("Y20").setValue(ranks[8]); 
sheet.getRange("AA20").setValue(ranks[9]); 
sheet.getRange("AC20").setValue(ranks[10]); 
sheet.getRange("AE20").setValue(ranks[11]); 
sheet.getRange("AG20").setValue(ranks[12]); 
sheet.getRange("AI20").setValue(ranks[13]); 
sheet.getRange("AK20").setValue(ranks[14]); 
sheet.getRange("AM20").setValue(ranks[15]); 
sheet.getRange("AO20").setValue(ranks[16]); 
sheet.getRange("AQ20").setValue(ranks[17]); 
sheet.getRange("AS20").setValue(ranks[18]); 
sheet.getRange("AU20").setValue(ranks[19]); 
sheet.getRange("AW20").setValue(ranks[20]); 
sheet.getRange("AY20").setValue(ranks[21]); 
sheet.getRange("BA20").setValue(ranks[22]); 
sheet.getRange("BC20").setValue(ranks[23]); 
sheet.getRange("BE20").setValue(ranks[24]); 
sheet.getRange("BG20").setValue(ranks[25]); 
sheet.getRange("BI20").setValue(ranks[26]); 
sheet.getRange("BK20").setValue(ranks[27]); 
sheet.getRange("BM20").setValue(ranks[28]); 
sheet.getRange("BO20").setValue(ranks[29]); 
sheet.getRange("BQ20").setValue(ranks[30]); 
sheet.getRange("BR20").setValue(ranks[31]); 
} 

正如你所看到的,代码真的很sl。。那可能是因为我之前从未做过JavaScript,而且我的编码知识一般都很基础。

有没有办法直接在电子表格中实现这样的功能,而不需要脚本API呢?

在此先感谢您的帮助!

回答

0
for(i=0;i<numRanks;i++) 
    sheet.getRange(20, i*2+9).setValue(ranks[i]); 

基本上你只是遍历第二十行每隔一列迭代for循环。

功能文档here

0

Jason的回答很明确&简短 - 但由于对电子表格服务的调用次数很少,因此效率不高。

有关此问题的背景信息,请参见Google Apps Script Best Practices。你可能也想看看What is faster: ScriptDb or SpreadsheetApp?。你已经有了ranks的数组;如果将其转换为具有行中值的二维数组,则可以将其写入一个setValues()操作中。

sheet.getRange("I20:BR20").setValues(transpose([ranks])); 

这是一个转置功能,从Google Spreadsheet Script - How to Transpose/Rotate Multi-dimensional Array?

function transpose(a) 
{ 
    return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); }); 
} 

还有反复发生,但它现在是在转功能,而不是周围的setValue()调用,因此这将更快运行。