【问题标题】:In Google script a function called by onEdit doesn't work as launched alone [duplicate]在 Google 脚本中,由 onEdit 调用的函数无法单独启动 [重复]
【发布时间】:2021-02-12 13:57:48
【问题描述】:

如果我单独启动我的函数Creaevento()Cancellaevento(),它们会从 Google 脚本开始并正确完成工作;但是,如果这些函数是由onEdit(e) 函数启动的,它们到达时就会停止工作:

  • 这里var eventCal = CalendarApp.getCalendarById(calendarId)
  • 或这里var event = CalendarApp.getCalendarById(calendarId).createAllDayEvent(titolo, data)

有什么想法吗? 这是代码。 谢谢

function Cancellaevento() {
  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var activeCell = spreadsheet.getActiveCell();
  
  /**Andare a inizio riga */
  var firstCell = activeCell.offset(0, 1-activeCell.getColumn());
  firstCell.activate();

  /**Recuperare valori dati */
  var calendarId = spreadsheet.getRange("A2").getValue();
  firstCell.activate();
  spreadsheet.getCurrentCell().offset(0, 1).activate();
  var data = spreadsheet.getCurrentCell().getValue();
  spreadsheet.getCurrentCell().offset(0, 2).activate();
  var titolo = spreadsheet.getCurrentCell().getValue();  
  
  //Accedere al calendario
  var eventCal = CalendarApp.getCalendarById(calendarId);

  firstCell.activate();
  spreadsheet.getCurrentCell().offset(0, 4).activate();
  var eventID = spreadsheet.getCurrentCell().getValue();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});

  Browser.msgBox('Checkpoint');
  var event = eventCal.getEventById(eventID);
  
  // show event name in log
  Browser.msgBox('Cancellato "' + event.getTitle() + '" in data ' + event.getAllDayStartDate() + '\\n');
  
  //Eliminare evento
  event.deleteEvent();

  //Deflaggare evento
  firstCell.activate();
  spreadsheet.getCurrentCell().offset(0, 5).activate();

  
};


function Creaevento() {

  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var activeCell = spreadsheet.getActiveCell();
  
  /**Andare a inizio riga */
  var firstCell = activeCell.offset(0, 1-activeCell.getColumn());
  firstCell.activate();

  /**Recuperare valori dati */
  var calendarId = spreadsheet.getRange("A2").getValue();
  firstCell.activate();
  spreadsheet.getCurrentCell().offset(0, 1).activate();
  var data = spreadsheet.getCurrentCell().getValue();
  spreadsheet.getCurrentCell().offset(0, 1).activate();  
  var mail = spreadsheet.getCurrentCell().getValue();
  spreadsheet.getCurrentCell().offset(0, 1).activate();
  var titolo = spreadsheet.getCurrentCell().getValue();
  spreadsheet.getCurrentCell().offset(0, 5).activate();
  var consegna = spreadsheet.getCurrentCell().getValue();
  
  //Accedere al calendario
  Browser.msgBox('Checkpoint'); 

  //Creare evento
  var event = CalendarApp.getCalendarById(calendarId).createAllDayEvent(titolo, data/**, {description:consegna,guests:mail,sendInvites: true}*/);

  
  //Salvare eventID
  spreadsheet.getCurrentCell().offset(0, -4).activate();
  spreadsheet.getCurrentCell().setValue(event.getId());

  //Log
  Browser.msgBox('Evento "' + titolo + '" in data ' + data + ' creato con successo');
  
  //Flaggare evento
  firstCell.activate();
  spreadsheet.getCurrentCell().offset(0, 5).activate();

  
};


function onEdit(e) {
  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var checkbox = spreadsheet.getCurrentCell().getValue();
  //let cellCheck = (e.range.getColumn() == 6);
  //if (!(cellCheck)) {
  if (e.range.getColumn() == 6 && checkbox==true){
    Browser.msgBox('Lancio Crea evento');
    Creaevento();
  }else if(e.range.getColumn() == 6 && checkbox==false){
    Browser.msgBox('Confermi cancellazione evento?');
    Cancellaevento();
  }else{
    Browser.msgBox('None');
  }
}

【问题讨论】:

  • 重命名函数并按照重复帖子中的建议创建可安装触发器。
  • 同样在执行页面你可以找到你所有函数的执行。由于这是一个触发功能,您在执行时看不到执行情况。你需要去执行页面看看你的代码有没有错误。在那里,您可以看到确切的错误作为重复问题的标题,因此您可以更轻松地找到解决方案。

标签: google-apps-script google-sheets


【解决方案1】:

您应该改掉使用activate 和getActiveCell 的习惯。在 onEdit(e) 的情况下,您应该将 e 转移到子函数,然后活动单元格将是 e.range 然后您可以替换它:

  spreadsheet.getCurrentCell().offset(0, 1).activate();
  var data = spreadsheet.getCurrentCell().getValue();
  spreadsheet.getCurrentCell().offset(0, 1).activate();  
  var mail = spreadsheet.getCurrentCell().getValue();
  spreadsheet.getCurrentCell().offset(0, 1).activate();
  var titolo = spreadsheet.getCurrentCell().getValue();
  spreadsheet.getCurrentCell().offset(0, 5).activate();
  var consegna = spreadsheet.getCurrentCell().getValue();
  

这样的:

var data = e.range.offset(0,1).getValue();
var mail = e.range.offset(0,2).getValue();
var titole = e.range.offset(0,3).getValue();

实际上,一个更好的方法是:

const sh=e.range.getSheet();
const values=sh.getRange(e.range.rowStart,e.range.columnStart,1,5).getValues()[0];
const data=values[1];
const mail=values[2];
const titole=values[3]

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多