Ошибка глобальной переменной на стороне сервера скриптов Google Apps - PullRequest
0 голосов
/ 15 февраля 2020

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

function extractData(row){
  extractEmail(row);
  extractPoints(row);
  extractUsername(row);
  extractName(row);
  extractType(row);
  extractFamily(row);
  return "success";
}

function extractEmail(row){
  try{
    var url = "https://docs.google.com/spreadsheets/d/1pIC6Lyx4Q0ZjEA5GURZ3gA5qLmUJ0_7yGPJQmr6-GnQ/edit?usp=sharing";
    var sheet = SpreadsheetApp.openByUrl(url);
    var subsheet = sheet.getSheetByName("Accounts");
    var col = 2
    Gemail = String(subsheet.getRange(Number(row), col).getValue());
  }
  catch(error){
    Logger.log(error.message);
    }
}

function extractPoints(row){
  var url = "https://docs.google.com/spreadsheets/d/1pIC6Lyx4Q0ZjEA5GURZ3gA5qLmUJ0_7yGPJQmr6-GnQ/edit?usp=sharing";
  var sheet = SpreadsheetApp.openByUrl(url);
  var subsheet = sheet.getSheetByName("Accounts");
  var col = 6;
  Gpoints = Number(subsheet.getRange(Number(row), col).getValue());
}

function extractUsername(row){
  var url = "https://docs.google.com/spreadsheets/d/1pIC6Lyx4Q0ZjEA5GURZ3gA5qLmUJ0_7yGPJQmr6-GnQ/edit?usp=sharing";
  var sheet = SpreadsheetApp.openByUrl(url);
  var subsheet = sheet.getSheetByName("Accounts");
  var col = 4;
  Gusername = String(subsheet.getRange(row, col).getValue());
}

function extractName(row){
  var url = "https://docs.google.com/spreadsheets/d/1pIC6Lyx4Q0ZjEA5GURZ3gA5qLmUJ0_7yGPJQmr6-GnQ/edit?usp=sharing";
  var sheet = SpreadsheetApp.openByUrl(url);
  var subsheet = sheet.getSheetByName("Accounts");
  var col = 3;
  Gname = String(subsheet.getRange(row, col).getValue());
}

function extractType(row){
  var url = "https://docs.google.com/spreadsheets/d/1pIC6Lyx4Q0ZjEA5GURZ3gA5qLmUJ0_7yGPJQmr6-GnQ/edit?usp=sharing";
  var sheet = SpreadsheetApp.openByUrl(url);
  var subsheet = sheet.getSheetByName("Accounts");
  var col = 7;
  Gtype = String(subsheet.getRange(row, col).getValue());
}

function extractFamily(row){
  var url = "https://docs.google.com/spreadsheets/d/1pIC6Lyx4Q0ZjEA5GURZ3gA5qLmUJ0_7yGPJQmr6-GnQ/edit?usp=sharing";
  var sheet = SpreadsheetApp.openByUrl(url);
  var subsheet = sheet.getSheetByName("Accounts");
  var col = 12;
  Gfamily = String(subsheet.getRange(row, col).getValue());
  Logger.log(Gfamily);
}

function definer(){
  try{
  Utilities.sleep(5000);
  Logger.log(Gfamily);
  var data = [Gemail, Gname, Gusername, Gpoints, Gtype, Gfamily];
  return data;
  }
  catch(error){
    Logger.log(error.message);
  }
}

Код выше - на стороне сервера. Каждая функция вызывается на стороне клиента вместе с уже определенной строкой. Первая функция, вызываемая на стороне клиента: extractData . Когда глобальная переменная Gfamily зарегистрирована, она корректно отображается как testers . После следующей функции: определитель вызывается со стороны клиента, Gfamily регистрируется как null . Пожалуйста, скажите мне, как я могу улучшить этот вопрос, если мне что-то неясно. Ниже приведен скриншот журналов: Снимок экрана: Журналы Stackdriver, показывающие, как Gfamily неожиданно становится неопределенной

1 Ответ

1 голос
/ 15 февраля 2020

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

Для совместного использования значения несколькими пользователями, я рекомендую использовать Свойства скрипта или Кэш скрипта . Значения, сохраненные в свойствах / кэше скрипта, будут доступны всем пользователям вашего веб-приложения. Если один пользователь обновит значение, новое значение будет немедленно доступно всем другим пользователям. Я рекомендую использовать это с Window.sessionStorage , который будет очищаться автоматически после завершения сеанса страницы. Таким образом, вы можете передать данные сеанса на сервер, а затем вручную отследить, когда сеанс завершится.

Однако я не совсем понимаю, как вы собираетесь использовать общее значение, зависящее от нескольких пользовательских сеансов. Если один из пользователей завершает сеанс, что происходит с общим значением?

Это заставляет меня думать, что может быть некоторая неправильная интерпретация, особенно из-за вашего предложения

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

Свойства пользователя не являются общими, , если вы не развернули приложение на " Запустите приложение как я ". Если вы это сделаете, то сценарий всегда будет выполняться под одной и той же (вашей) учетной записью пользователя, и все свойства пользователя будут общими. Но если бы вы просто установили «Запускать приложение как пользователь, обращающийся к веб-приложению», то вы могли бы безопасно использовать свойства / кэш пользователя, не беспокоясь о смешанных учетных записях. (Назначение пользовательских свойств / кэша состоит в том, чтобы избежать проблем области действия, таких как смешивание между учетными записями - взгляните на эту таблицу сравнения .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...