首页 > 解决方案 > 使用自定义侧边栏,取选定范围并输出线性比例,并在开始值和结束值之间舍入

问题描述

在我制作的电子表格上,我经常需要仅使用整数(整数)来制作一系列缩放值。

例如,从 90 开始到 120 结束的 12 个值线性缩放到最接近的整数。

使用谷歌表格函数,我可以使用以下公式在这些值之间画一条线:

=(previousValue+((finalValue-firstValue))/(ROW(finalValue)-ROW(firstValue)))

然后在锁定 finalValue 和 firstValues 后向下拖动此公式。

但是这个公式会产生浮点值。添加舍入函数将导致结果尽可能不呈线性,并且重度舍入(例如最接近的 2 或 5)可能会导致它根本无法缩放

理想情况下,由于电子表格已经很大,而且我不想每次都复制列,所以我需要一种方法来完成此操作,而无需向电子表格添加额外的行或列。

理想的方式似乎是使用 appscript 和侧边栏。但是,如果你认为你可以用一个公式来解决这个问题,我也愿意接受这个答案。

对于侧边栏,您可以选择要缩放的值范围,然后按侧边栏中的按钮运行脚本。

该脚本将取值范围,找到 Start 和 End 值,然后复制上述公式的效果。

之后,它将独立地对每个结果进行四舍五入(理想情况下,如果我想四舍五入到最接近的 5,则最好使用来自文本框或类似内容的用户输入值,即 5),然后输出选择的开始和结束之间的缩放值。

这只需要针对排列在单列中的一维值范围,它不需要跨多列工作。如果你能做到的话,它也不需要通过奖励积分来处理多个选择。

编辑:这是我到目前为止的代码,但我一直在努力弄清楚如何让按钮工作

应用脚本

var ui = SpreadsheetApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
const button = document.querySelector('input')


button.addEventListener('click', scale)

function onOpen() {
 ui.createMenu('Custom Menu')
  .addItem('Show sidebar', 'showSidebar')
  .addToUi()
}

function showAlert(obj) {
  var result = ui.alert(obj)
}


function showSidebar(){

  var html = HtmlService.createHtmlOutputFromFile('Sidebar')
    .setWidth(300)
  SpreadsheetApp.getUi().showSidebar(html)

}

function scale(){
  var minVar = document.getElementById('minVar').value
  var maxVar = document.getElementById('maxVar').value

  var selection = SpreadsheetApp.getActiveSpreadsheet().getSelection()
  var activeRange = selection.getActiveRange()
  showAlert(activeRange.data)

}

HTML

<!DOCTYPE html>
<html>

<head>
  <style>
    /* Added light green background to page*/
    body {
      background-color: darkgrey;
    }
    div {
      width: 90%;
      border-style: double;
      border-width: 2px;
      border-color: red;
      margin-top: 5px;
      /*right left set to auto centers content */
      margin-left: auto;
      margin-right: auto;
      padding: 3px;
      background-color: white;
    }
    h1 {
      text-align: center;
    }
  </style>
</head>

<body>
  <div>
  <label>Minimum Value,</label>
  <input type="text" id="minVar" value="">
  </div>

  <div>
  <label>Maximum Value,</label>
  <input type="text" id="maxVar" value="">    
  </div>

  <div>
  <input type="button" value="Scale Selected Range" id="scaleStart">
  </div>

</body>

</html>

标签: google-apps-scriptgoogle-sheets

解决方案


推荐阅读