在制作电子表格时,我经常需要仅使用整数(整数)来设置一定范围的缩放值。
例如,从90开始到120结束的12个值线性缩放至最接近的整数。
使用Google表格功能,我可以使用以下公式在这些值之间划一条线:
=(previousValue+((finalValue-firstValue))/(ROW(finalValue)-ROW(firstValue)))
在锁定finalValue和firstValues之后,您可以将该公式向下拖动。
但是此公式将产生浮点值。添加舍入函数会导致结果尽可能不线性,如果舍入较大的舍入(例如精确到2或5),则可能根本无法缩放
理想情况下,由于电子表格已经很大,并且我不想每次都重复列,因此我需要一种无需在电子表格中添加其他行或列的方式来完成此操作。
理想的方法似乎是使用appscript和侧边栏。但是,如果您认为可以使用公式解决此问题,我也很乐意提供答案。
对于边栏,尽管您可以选择要缩放的值的范围,然后按边栏中的按钮运行脚本。
该脚本将采用值的范围,找到“开始”和“结束”值,然后复制上述公式的效果。
之后,它将对每个结果独立取整(理想情况下,使用文本框中的用户输入值或类似的值,即如果我想取整为最接近的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>