google-apps-script - 选择状态时将 2 列数据移动到不同的选项卡
问题描述
我仍然是使用应用程序脚本的初学者,我的经验有限。我一直在尝试更改为类似任务运行的脚本,但在进行一些更改时无法使其正常工作。
我希望实现的是,在 ProspectiveSites 选项卡的 Z 列中选择“是”时,然后将第 15 和 24 列移动到 2019 年 7 月,进入 A 和 B 列,并在“总计”行上方输入。这目前位于第 28 行,但会根据需要在页面上上下移动。
如果可能的话,我希望它根据当前月份移动,即现在是 7 月,因此移动该 July2019 选项卡,在 8 月移动到 August2019 等等。
尝试运行脚本时出现此错误;TypeError:无法从未定义中读取属性“范围”。(第 3 行,文件“代码”)
这是一个示例 https://docs.google.com/spreadsheets/d/1q2nJ0A-GBqRFxtLl3tTk-AFzYQU-NU5w_gqYt5C4xVs/edit?usp=sharing
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSheet();
if (ss.getName() == 'ProspectiveSites' && e.range.getColumn() ==
26) {
// Copy selected row to another sheet
var targetSheet =
SpreadsheetApp.getActive().getSheetByName('July2019');
var copyColumns = [15, 24]; // Column indices start with 1
if (e.range.getValue() == 'Yes') {
var row = e.range.getRow(),
targetData = [];
var rowData = e.range.offset(0, 0, 1,
ss.getDataRange().getLastColumn()).getValues()[0];
for (var i in rowData) {
if (copyColumns.indexOf(parseInt(i) + 1) > -1) {
targetData.push(rowData[i]);
} else {
targetData.push('');
}
}
while (targetData[targetData.length - 1] == '')
targetData.pop();
Logger.log(rowData);
Logger.log(targetData);
row = targetSheet.getDataRange().getLastRow() + 1;
targetSheet.getRange(row, 1, 1,
targetData.length).setValues([targetData]);
}
}
}
解决方案
当您更改电子表格中任何单元格的值时onEdit(e)
,触发器会自动运行。
传递给函数的e
值是一个事件对象,它提供函数信息以便它可以响应。在这种情况下,事件对象将包含{authMode=LIMITED, range=Range, source=Spreadsheet, user=username@domain.com, value=updatedvalue}
您可以在其中查看是否Logger.log(e)
在onEdit(e)
函数中运行。
看起来你正试图过度设计这个问题。实际上,您需要做的就是获取 Dropdown 正在编辑的行的值,并将相应的O
和X
单元格复制到 July2019 工作表:
function obtainFirstBlankRow() {
var sheet = SpreadsheetApp.getActive().getSheetByName('July2019');
// search for first blank row
var col = sheet.getRange('A:A');
var vals = col.getValues();
var count = 0;
while (vals[count][0] != "") {
count++;
}
return count + 1;
}
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSheet();
if (ss.getName() == 'ProspectiveSites' && e.range.getColumn() == 26) {
if (e.range.getValue() != 'Yes'){
return;
}
var sourceSheet = SpreadsheetApp.getActive().getSheetByName('ProspectiveSites');
var targetSheet = SpreadsheetApp.getActive().getSheetByName('July2019');
var cell15 = sourceSheet.getRange('O' + e.range.getRow() + ':O' + e.range.getRow()).getValue();
var cell24 = sourceSheet.getRange('X' + e.range.getRow() + ':X' + e.range.getRow()).getValue();
var row = obtainFirstBlankRow();
targetSheet.getRange(row, 1).setValue(cell15);
targetSheet.getRange(row, 2).setValue(cell24);
}
}
推荐阅读
- java - 获取类的静态变量值
- regex - 以下代码在 AIX 服务器中显示错误,但在 Red Hat 服务器中工作正常
- c++ - 有没有办法告诉 g++ 编译器,不要在某个 -I 路径中查找包含头文件?
- git - 从svn导入后重新打包
- angular - AWS MQTT over websocket 与 ngx-mqtt
- python - 如何使用 GridSearchCV 通过 train_test_split 策略调整参数?
- mongodb - 如何聚合数组字段总和在两个值之间的数据?
- android - 文件对象的图像 URL
- php - 使用未定义的常量 make - 假定为“makes”
- html - SVG 矢量图像动画