首页 > 解决方案 > 脚本正在触发但没有任何反应?

问题描述

我想创建一个脚本,当我在特定列中将数据标记为已完成时,将数据从一张表移动到另一张表。使用我在互联网上找到的其他一些代码,我有这个,但是当我进入并将状态更改为完成时,没有任何反应。谷歌应用程序脚本中的触发页面说它正在执行,但它没有对实际工作表做任何事情。这是代码:

    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
  }
}

标签: google-apps-scriptgoogle-sheets

解决方案


问题及解决方案:

您当前的代码有几个问题:

  • 如果要检查工作表名称,则必须使用Sheet.getName()SpreadsheetApp.getActiveSpreadsheet()只是返回 active spreadsheet, not sheet,也不是它的名字。
  • 如果你想从多个单元格中获取值,你应该使用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();
  }
}

推荐阅读