【问题标题】:Google Spreadsheet ranking valuesGoogle 电子表格排名值
【发布时间】:2013-03-21 09:05:07
【问题描述】:

我目前正在使用 Google 电子表格设置决策矩阵,并且我想为结果实施排名功能。如果只有 4 个选项,我不会这样做,但就我而言,有 32 个选项可用...

我尝试使用 google script 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]);
}

如您所见,代码确实很草率。那可能是因为我以前从未做过 javascript,而且我的编码知识总体上非常基础。

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

提前感谢您的帮助!

【问题讨论】:

    标签: javascript google-apps-script google-sheets


    【解决方案1】:
    for(i=0;i<numRanks;i++)
        sheet.getRange(20, i*2+9).setValue(ranks[i]);
    

    基本上,您只需每隔一列在第 20 行上迭代一个 for 循环。

    函数文档here.

    【讨论】:

      【解决方案2】:

      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() 调用周围,所以它会运行得更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多