2013-03-21 5 views
2

현재 Google 스프레드 시트로 결정 매트릭스를 설정하고 있으며 결과에 대한 순위 지정 기능을 구현하고 싶습니다. 난 단지 4 옵션이 있다면,이 작업을 수행하지만, 내 경우에는 Google 스프레드 시트 순위 값

내가 구글 스크립트 API를 사용하여이 작업을 수행하려고했으나 결과는 좀 실망 ... 32 개 사용할 수있는 옵션처럼이 있습니다 wouldnt가 :

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]); 
} 

자세히 알 수 있듯이 코드는 실제로 엉성함. 그 전에는 자바 스크립트를 한번도 해 본 적이 없기 때문에 아마도 코딩 지식은 일반적으로 매우 기본 적이기 때문일 것입니다.

스크립트 api가 없어도 스프레드 시트에서 직접 이러한 기능을 구현할 수 있습니까?

미리 도움을 청하십시오!

답변

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

기본적으로 다른 모든 열에서 20 번째 행에 대해 for 루프를 반복합니다.

기능 설명서 here.

0

제이슨 대답은 분명합니다. & 짧은 -하지만 스프레드 시트 서비스에 대한 호출 수가 많아 효율적이지 않습니다.

이 문제에 대한 배경 지식은 Google Apps Script Best Practices을 참조하십시오. What is faster: ScriptDb or SpreadsheetApp?을보고 싶을 수도 있습니다.

이미 배열이 ranks입니다. 이를 행의 값을 가진 2 차원 배열로 변환하면 하나의 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() 호출 주위의 지금 전치 기능에, 그래서이 더 빨리 실행됩니다.