【问题标题】:How do I find the Max and Min values of a row that my if statement has been applied to?如何找到我的 if 语句已应用到的行的 Max 和 Min 值?
【发布时间】:2021-05-28 20:11:37
【问题描述】:

所以昨天给了我这个,效果很好,但我被要求在我下面的函数已应用的行上加粗最小值和最大值。我有 3 个不同的数据集,在不同的行上有不同的值,所以我不能只要求它加粗第 7 行。我需要证明这可以应用于任何给定的数据。有谁知道如何实现这一点,我的数据在所有 3 个数据集的 C3:W16 之间以节省混淆。

function searchOutput() {

  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getRange("C3:W16").getValues();
  data.forEach(function (row, i)
  {row.forEach(function (cell, j)
   {if(cell >= 5 && row[j + 1] < 5){sheet.getRange(i + 3, j + 3, 1, 2).setFontWeight("bold")
   {if(cell Math.max(...row)).getRange(i + 3, j + 3, 1, 1).setFontWeight("bold")
   {if(cell Math.min(...row)).getRange(i + 3, j + 3, 1, 1).setFontWeight("bold")}}}})})

}

【问题讨论】:

  • 如果有多个最大值和最小值怎么办?例如,假设该行中的最大值是 10,而您有两个 10。你想把它们都加粗吗?
  • 是的,但是当函数沿着列运行时,我需要它先找到最大值,然后再找到最小值。如果最小值在最大值之前,那么所代表的数据将意味着该数据所代表的功率输出将不起作用。
  • 不幸的是,这让我很困惑。您能否提供示例输入和预期输出?它不必是全范围。只需提供 3x3 虚拟单元的屏幕截图,并向我们展示预期的输出。一图胜千言
  • 你去吧,所以你看到的我的功能是将 >5 和
  • 您可以使用Math.max(...row)Math.min(...row) 轻松找到一行的最大值或最小值。扩展语法... 将自动将数组的内容映射为这些函数的参数。然后,您可以遍历该行的项目,检查最小值或最大值是否相等并更新单元格的格式。

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


【解决方案1】:

有一个 3 步方法可以优化处理多行:

  1. 使用批量 getter 方法从工作表中获取值、格式或其他状态的数组。
  2. 处理和更新获取的数组。
  3. 使用批量设置方法将更新后的值、格式或其他状态写回工作表。

这是必要的 b/c 在循环中多次调用 getRange()setFontWeight() 等工作表方法的计算成本很高。

因此,您首先需要弄清楚哪些批量 getter 和 setter 方法适用于您的用例。

在您的场景中,您需要连续查找最小值和最大值,因此 getValues() 是必须的。而且您想更新这些单元格的字体粗细,所以getFontWeights()setFontWeights() 也是必要的。

提示 如果您需要为其他资源找到getter 或setter 方法,请查看Range 对象的文档。一般规则是,任何以getset 为前缀并以s 结尾的方法都是批量getter 或setter 方法。

既然你知道你需要什么,那么编写代码就相当简单了:

function boldMinMax() {
    var range = SpreadsheetApp.getActiveSheet().getRange("C3:W16");
    
    // fetch array of arrays of row values and array of arrays of font weights in bulk using getter methods
    var valueRows = range.getValues();
    var fontWeightRows = range.getFontWeights();
    
    // process fetched arrays updating font weights for min and max cells
    valuesRows.forEach(function(valueRow, rowIndex) {
        
        // Only need to calculate min and max once per row
        var min = Math.min(...valueRow);
        var max = Math.max(...valueRow);
        
        // find and update fontWeightRow
        var fontWeightRow = fontWeightRows[rowIndex];
        
        valueRow.forEach(function(value, cellIndex) {
            if (value === min || value === max) {
                fontWeightRow[cellIndex] = 'bold';
            }
        });
    });
    
    // Write updated font weights back to sheet
    range.setFontWeights(fontWeightRows);

}

这应该足以让您排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多