Как повторно использовать этот код вместо копирования и вставки?

avatar
JupiterJones
8 августа 2021 в 23:43
65
2
0

Я хочу создавать и синхронизировать события из моего календаря в электронную таблицу и наоборот.

Дело в том, что у меня есть 3 листа в электронной таблице, каждый из которых я хочу синхронизировать с другим календарем. Пока я сделал это:

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 листа один за другим без повторного запуска кода. Он просто проверит активный лист и проигнорирует остальные, пока я не перейду к другому листу.

Также я хочу добавить кнопку в меню. Но я знаю, как это сделать.

Мое предположение (я действительно мало что знаю о программировании) состоит в том, что я ищу способ сделать функцию, которая проверяет и обновляет календарь и лист, и еще одну, которая назначает правильный идентификатор календаря и листа для он ищет, просматривая все 3 листа. И привязать последний к одной кнопке в меню.

Любая помощь приветствуется!

Извините за плохой английский.

Источник

Ответы (2)

avatar
Julian Benavides
9 августа 2021 в 00:34
1

если я правильно понял, то можно переиспользовать код и получить параметры, например

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);
      }
    }
  }
}
JupiterJones
9 августа 2021 в 10:24
0

Большое тебе спасибо. Это отлично решает.

avatar
aNewb
9 августа 2021 в 00:16
0
    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
    }
JupiterJones
9 августа 2021 в 00:30
0

Привет. Спасибо за ответ. Разве я не буду копировать и вставлять один и тот же код 3 раза, если сделаю это? Я стараюсь этого не делать, чтобы код не был таким грязным. Читая описание различных функций обновления, я думаю, что понял, как бы я хотел подойти к проблеме: возможно ли передать информацию из одной функции в другую? Если да, то как мне это сделать? Нужно ли создавать переменные для хранения информации и вызывать их внутри другой функции?

aNewb
9 августа 2021 в 01:45
0

Код в вашем редакторе скриптов используется всеми листами электронной таблицы. Если вы говорите о нескольких электронных таблицах, вам придется использовать что-то вроде библиотеки. Я никогда этого не делал.