【发布时间】:2020-08-28 20:18:39
【问题描述】:
首先,我没有编程背景,但我一直致力于在 Google 表格中为龙与地下城 5e 创建一个主动跟踪器。
我想做的是有一个宏为我做这件事:当我激活它时,它将搜索范围(在这种情况下为 C 列),找到具有最低数值的单元格,然后将 1 添加到它。
任何帮助将不胜感激!
【问题讨论】:
标签: javascript google-apps-script google-sheets google-sheets-api
首先,我没有编程背景,但我一直致力于在 Google 表格中为龙与地下城 5e 创建一个主动跟踪器。
我想做的是有一个宏为我做这件事:当我激活它时,它将搜索范围(在这种情况下为 C 列),找到具有最低数值的单元格,然后将 1 添加到它。
任何帮助将不胜感激!
【问题讨论】:
标签: javascript google-apps-script google-sheets google-sheets-api
这个任务可以分解成两个不同的子任务:
您需要与电子表格文件交互以获取C 列 的值。以下代码从 Sheet1 获取列 C 的值,从第二行开始直到最后一行的内容:
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1');
const cVals = sh.getRange('C2:C'+sh.getLastRow()).getValues().flat(1);
cVals 是 Sheet1 中所有 C 值的列表。为了找到具有最小值的条目,您可以利用 reduce() 方法:
const indexMin = cVals.reduce((min_i, x, i, ar) => x < ar[min_i] ? i : min_i, 0);
这给出了indexMin 中具有最低值的元素的位置,从0 开始。但是,cVals 有一个从 C2 开始的 C 值列表。这就是为什么我们添加 2 以便在工作表中 C 列具有最低值的工作表中找到 row number,然后我们将 1 添加到旧值:
sh.getRange(indexMin+2,3).setValue(sh.getRange(indexMin+2,3).getValue()+1)
最后,您希望能够从电子表格文件中执行此功能。为了实现这一点,您可以使用以下代码创建一个自定义菜单(宏):
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Macros')
.addItem('Add one to C minimum', 'plusOne')
.addToUi();
}
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Macros')
.addItem('Add one to C minimum', 'plusOne')
.addToUi();
}
function plusOne() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1');
const last_row = sh.getLastRow();
const num_rows = sh.getRange('C:C').getValues().filter(String).length;
const num_blank = last_row-num_rows;
const cVals = sh.getRange('C2:C'+last_row).getValues().flat(1);
const indexMin = cVals.reduce((min_i, x, i, ar) => x < ar[min_i] ? i : min_i, 0);
sh.getRange(indexMin+2+num_blank,3).setValue(sh.getRange(indexMin+2+num_blank,3).getValue()+1)
}
Google Apps 脚本:
JavaScript 库:
【讨论】: