google-apps-script - 脚本正在触发但没有任何反应?
问题描述
我想创建一个脚本,当我在特定列中将数据标记为已完成时,将数据从一张表移动到另一张表。使用我在互联网上找到的其他一些代码,我有这个,但是当我进入并将状态更改为完成时,没有任何反应。谷歌应用程序脚本中的触发页面说它正在执行,但它没有对实际工作表做任何事情。这是代码:
function onEdit(e) {
if(SpreadsheetApp.getActiveSpreadsheet() == "Planner" && e.value == "Completed"){ //If the edit was on Planner marking the Status "Completed"
var spr = SpreadsheetApp.getActiveSpreadsheet();
var myRange = e.range.offset(0,-3,0,3).getValue() //get the information from Planner
//find the first row of Calendar where completed assignments is blank
var column = spr.getRange('O:O');
var values = column.getValues(); // get all data in one call
var ct = 0;
while ( values[ct][0] != "" ) {
ct++;
ct++;
e.source.getSheetByName("Calendar").getRange(ct,15,1,3).setValues(myRange).getValues(); //copy the values from Planner to Calendar
e.source.getSheetByName("Planner").getRange(myRange).setValues("").getValues(); //delete values from Planner
;}
return (ct);
}
}
我认为它有问题,但我不知道是什么。我以前从未使用过应用程序脚本,所以老实说我不知道自己在做什么。这是工作表: 工作表
当我更改状态时,我想将完成的作业从计划表移动到日历表。非常感谢您的帮助!!
编辑:我使用了 lamblichus 的代码,它工作得很好,只是在我移动它之后我仍然想从 Planner Sheet 中删除数据。我尝试了这段代码,但它没有用:
function onEdit(e) {
const ss = e.source;
const range = e.range;
const sheet = range.getSheet();
if (sheet.getName() == "Planner" && e.value == "Completed") {
var otherData = range.offset(0,-3,1,3).getValues();
var currentClass = range.offset(0,-4).getMergedRanges()[0].getValue();
var [task,,date] = otherData[0];
var targetSheet = ss.getSheetByName("Calendar");
var targetRange = targetSheet.getRange("O1").getNextDataCell(SpreadsheetApp.Direction.DOWN).offset(1,0,1,3);
targetRange.setValues([[date,task,currentClass]]);
var initialSheet = ss.getSheetByName("Planner");
var initialRange = initialSheet.range.offset(0,-3,1,3);
initialRange.clearContent(); //delete values from Planner
}
}
解决方案
问题及解决方案:
您当前的代码有几个问题:
- 如果要检查工作表名称,则必须使用Sheet.getName()。SpreadsheetApp.getActiveSpreadsheet()只是返回 active
spreadsheet
, notsheet
,也不是它的名字。 - 如果你想从多个单元格中获取值,你应该使用getValues(),而不是getValue()。
- offset的第三个参数对应于结果范围的行数。因此,它不应该
0
。 - “类”名称在合并范围内,只有合并范围内的左上角单元格包含相应的值。要获取该值,您可以使用getMergedRanges并检索结果数组中的第一个元素。由于
getValue()
返回范围左上角单元格中的值,它将返回“类”名称。
代码示例:
function onEdit(e) {
const ss = e.source;
const range = e.range;
const sheet = range.getSheet();
if (sheet.getName() == "Planner" && e.value == "Completed") {
var otherDataRange = range.offset(0,-3,1,3);
var otherData = otherDataRange.getValues();
var currentClass = range.offset(0,-4).getMergedRanges()[0].getValue();
var [task,,date] = otherData[0];
var targetSheet = ss.getSheetByName("Calendar");
var targetRange = targetSheet.getRange("O1").getNextDataCell(SpreadsheetApp.Direction.DOWN).offset(1,0,1,3);
targetRange.setValues([[date,task,currentClass]]);
otherDataRange.clearContent();
}
}
推荐阅读
- firebase - 为最终用户处理 Flutter 上的 Firebase 身份验证错误
- open-telemetry - Opentelemetry 收集器和代理有什么区别?
- android - 为什么 Kotlin Coroutine withTimeoutOrNull 花费的时间比分配的时间长?
- r - 正则表达式 IfThenElse 模式返回空字符
- c# - 使用 JSON 格式正确配置 NLog 到 IHostBuilder
- scala - 使用受控类型转换将 Map[String, Any] 转换为嵌套案例类
- php - 使用 API CURL PHP 的无效 Json 响应
- c# - Unity - 当脚本附加到场景中的游戏对象时,为什么脚本的getcomponent返回null
- python - 我正在创建一个函数,该函数返回一个显示布尔值的元组
- aws-sdk-js - aws-sdk v3 找不到凭据