Как использовать функцию другого сохраненного файла в Google таблицах?

#google-apps-script #google-sheets

Вопрос:

У меня есть одна электронная таблица, и во время работы со сценариями приложений я создал 2 файла, Code.gs с onEdit функцией и Data.gs с onOpen функцией.

с onOpen помощью я возьму строки и столбцы и преобразую их в данные json, затем я хочу использовать эти данные в Code.gs

Как мне добавить эту функцию получения данных из другого файла?

Я действительно почувствовал, что Google недостоин в первый раз из-за этого 😒

Комментарии:

1. Я не уверен, что знаю, как это сказать, но я бы сказал, что все функции в проекте находятся в одном и том же пространстве имен. Вы могли бы поместить все свои функции в Code.gs. Несколько файлов доступны только для того, чтобы их можно было лучше организовать, но все они имеют общий доступ к одним и тем же данным. Таким образом, вы можете хранить данные JSON, скажем, в службе свойств сценария, и извлекать эти данные из любой функции в любом файле проекта. И, конечно же, все функции проекта, содержащиеся в электронной таблице, имеют доступ ко всем листам в электронной таблице.

2. Я думаю, что вам может быть полезно прочитать весь раздел в разделе «Руководства» документации под названием «Изучение среды разработки».

3. Обычно onEdit(e) и onOpe () — это функции, которые выполняются с помощью триггеров, поэтому обычно вы не вызываете их из других функций, и они не возвращают никаких значений, потому что они выполняются триггером.

4. Вы можете создать новый лист в активной электронной таблице, сохранить json в его ячейках и проверить этот лист/ячейки из onEdit() функции.

5. Это хорошая идея @YuriKhristich. В конце концов, я пойду на компромисс с этим 😒

Ответ №1:

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

 function getGlobals(){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Globals');
  var rg=sh.getRange(1,1,sh.getLastRow(),2);
  var vA=rg.getValues();
  var g={};
  for(var i=0;i<vA.length;i  ){
    g[vA[i][0]]=vA[i][1];
  }
  return g;
}
    
function setGlobals(dfltObj){
  if(dfltObj){
    const ss=SpreadsheetApp.getActive();
    const sh=ss.getSheetByName('Globals');
    sh.clearContents();
    let vA=[];
    for(let key in dfltObj) {
      vA.push([key,dfltObj[key]]);
    }
    sh.getRange(1,1,vA.length,2).setValues(vA);          
  }
}
  
function getGlobal(name){
  return getGlobals()[name];
}

function setGlobal(name,value){
  var curObj=getGlobals();
  curObj[name]=value; 
  setGlobals(curObj);
}
 

И я мог бы использовать их в одном файле, но я предпочитаю хранить все файлы, которые имеют доступ к глобальному хэшу, все вместе в одном файле. Вот как я мог бы их использовать.

 function getSheetData(obj) {
  const ss = SpreadsheetApp.openById(getGlobal('ssid'));
  const sr = obj.startRow;
  const sh = ss.getSheetByName(obj.name);
  const vs = sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn()).getValues();
  return vs;
}
 

и я мог бы использовать эту функцию из любой точки проекта, вызвав ее следующим образом:

 function getSheet2Data() {
  const sh2Data = getSheetData({startRow:2,name:'Sheet2'});
  //and then use the data in the rest of the function.
}
 

Я надеюсь, что в этом есть смысл.

Комментарии:

1. Эй, @Купер, спасибо за ваши усилия помочь, но я не думаю, что это удовлетворяет мои потребности. Возможно, я не совсем понимаю ваш код, но, насколько я понял, мы можем вызывать любую функцию из любого файла просто обычно, спасибо за это. Но мне просто нужно было передавать значения между триггерами, как вы упомянули в комментариях. Я также посмотрел в Google, и я не нашел способа, которым мы могли бы передавать параметры/значения между двумя функциями триггера.

2. Моя главная задача-избежать задержки, потому что если я использую onEdit , то моя getGlobals функция будет вызываться при каждом редактировании, поэтому я подумал, что если я смогу сначала получить глобальные данные при загрузке листа и сохранить их, чтобы при любом редактировании они могли использовать эти значения