我如何重用此代码而不是复制和粘贴?

How do I reuse this code instead of copying and pasting?

我想创建事件并将其从我的日历同步到跨页sheet,反之亦然。

问题是我的 spreadsheet 中有 3 个 sheet,我想分别与不同的日历同步。 到目前为止,我已经做到了:

function eventosDatos() {

  var hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cal = CalendarApp.getCalendarById("calId");

  for (i = 3; i <= hoja.getLastRow(); i++) {
    var fecha = hoja.getRange(i, 8).getValue();

    if (fecha > 0) {
      var nombre = hoja.getRange(i, 3).getValue();
      var id = hoja.getRange(i, 11).getValue();

      if (id != 0) {
        var ulte = hoja.getRange(i, 9).getValue();
        var man = hoja.getRange(i, 10).getValue();
        var ide = cal.getEventById(id);
        var idf = ide.getAllDayStartDate();
        var idn = ide.getTitle();
        var ultev = ide.getLastUpdated();

        if ((ulte.valueOf() > ultev.valueOf()) && man == false) {
          ide.setAllDayDate(fecha);
          ide.setTitle(nombre);
          hoja.getRange(i, 9).setValue(ide.getLastUpdated());
          hoja.getRange(i, 10).setValue(true);
        }
        else if (ulte.valueOf() < ultev.valueOf()) {
          hoja.getRange(i, 8).setValue(idf);
          hoja.getRange(i, 3).setValue(idn);
          hoja.getRange(i, 9).setValue(ultev);
          hoja.getRange(i, 10).setValue(false);
        }
      }
      else {
        var nid = cal.createAllDayEvent(nombre, fecha).getId();
        var nultev = cal.getEventById(nid).getLastUpdated();
        hoja.getRange(i, 9).setValue(nultev);
        hoja.getRange(i, 11).setValue(nid);
      }
    }
  }
}

它完成了我想要的,但现在我一直在想办法重用它,而不是必须复制和粘贴它。

我考虑过像这样重新声明变量:

...
     if (hoja.getSheetName()=="example 1"){
        cal = CalendarApp.getCalendarById("calendar for example 1");
      }
      else if (hoja.getSheetName()=="example 2"){
        cal = CalendarApp.getCalendarById("calendar for example 2");
      }
...

但是如果没有我再次 运行 代码,它就不会是一个依次检查和更新所有 3 sheet 的循环。它只会检查活动的 sheet 并忽略其余部分,直到我转到另一个 sheet.

我还想在菜单中添加一个按钮。但我确实知道该怎么做。

我的猜测(我真的不太了解编程)是我正在寻找一种方法来制作一个检查和更新日历和 sheet 的函数,以及另一个分配正确的日历 ID 和 sheet 用于查找所有 3 个 sheet。并将后一个绑定到菜单中的单个按钮。

感谢任何帮助!

抱歉英语不好。

    function onOpen() {
      var ui = SpreadsheetApp.getUi();
      // Or DocumentApp or FormApp.
      ui.createMenu('Custom Menu')
          .addItem('Update animal', 'updateAnimal')
          .addItem('Update vegetable', 'updateVegetable')
          .addItem('Update mineral', 'updateMineral')
          .addItem('Update everything', 'updateAll')
          .addToUi();
    }

function updateAll() {
  updateAnimal();
  updateVegetable();
  updateMineral();
}
    
    function updateAnimal() {
      // does the sheet with animal stuff exist
      // does the calendar with animal stuff exist
      // call the code and pass in the animal stuff ids
    }
    
    function updateVegetable() {
      // does the sheet with vegetable stuff exist
      // does the calendar with vegetable stuff exist
      // call the code and pass in the vegetable stuff ids
    }
    
    function updateMineral() {
      // does the sheet with mineral stuff exist
      // does the calendar with mineral stuff exist
      // call the code and pass in the mineral stuff ids
    }

如果我理解的很好,你可以复用代码和接收参数,例如

function firstEjecution() {
  var hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var callId = hoja.getSheetName(); // You could change the sheet name as Calendar Id
  eventosDatos(calId,hoja);
}


function eventosDatos(calId,hoja) {
  var cal = CalendarApp.getCalendarById(calId);

  for (i = 3; i <= hoja.getLastRow(); i++) {
    var fecha = hoja.getRange(i, 8).getValue();

    if (fecha > 0) {
      var nombre = hoja.getRange(i, 3).getValue();
      var id = hoja.getRange(i, 11).getValue();

      if (id != 0) {
        var ulte = hoja.getRange(i, 9).getValue();
        var man = hoja.getRange(i, 10).getValue();
        var ide = cal.getEventById(id);
        var idf = ide.getAllDayStartDate();
        var idn = ide.getTitle();
        var ultev = ide.getLastUpdated();

        if ((ulte.valueOf() > ultev.valueOf()) && man == false) {
          ide.setAllDayDate(fecha);
          ide.setTitle(nombre);
          hoja.getRange(i, 9).setValue(ide.getLastUpdated());
          hoja.getRange(i, 10).setValue(true);
        }
        else if (ulte.valueOf() < ultev.valueOf()) {
          hoja.getRange(i, 8).setValue(idf);
          hoja.getRange(i, 3).setValue(idn);
          hoja.getRange(i, 9).setValue(ultev);
          hoja.getRange(i, 10).setValue(false);
        }
      }
      else {
        var nid = cal.createAllDayEvent(nombre, fecha).getId();
        var nultev = cal.getEventById(nid).getLastUpdated();
        hoja.getRange(i, 9).setValue(nultev);
        hoja.getRange(i, 11).setValue(nid);
      }
    }
  }
}