google-apps-script - 使用自定义侧边栏,取选定范围并输出线性比例,并在开始值和结束值之间舍入
问题描述
在我制作的电子表格上,我经常需要仅使用整数(整数)来制作一系列缩放值。
例如,从 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>
解决方案
推荐阅读
- clojure - 如何从 Clojure 中的指定点循环遍历集合?
- java - 同一资源中的Java线程同步问题
- react-native - 在 React Native App 中为导航容器添加渐变
- import - 从已删除状态导入资源后显示差异的 Terraform 计划
- c - 在 C 中,write() 返回错误的文件描述符错误
- java - 基于 Java 文本的游戏
- mercadopago - 如何测试mercadopago集成?
- amazon-web-services - 无服务器或 AWS NodeJS 开发工具包是否需要 HTTPS?
- html - 我无法使用 fs.createWriteStream 和 req.pipe 上传文件
- r - 具有多个选择条件的嵌套 ifelse 语句