#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
функция будет вызываться при каждом редактировании, поэтому я подумал, что если я смогу сначала получить глобальные данные при загрузке листа и сохранить их, чтобы при любом редактировании они могли использовать эти значения