Как передать массив объектов как глобальную переменную в Google Script - PullRequest
1 голос
/ 29 апреля 2019

У меня есть массив объектов, которые я передал из JS в GS. Вот пример того, как может выглядеть массив объектов (изменяется в зависимости от ввода пользователя)

var playersArray = 
[
{number=1, 
role=Arsonist, 
deathStatus=false, 
guardianTargetStatus=false, 
executionerTargetStatus=false, 
roleblockStatus=false}, 

{number=2, 
role=Arsonist, 
deathStatus=false, 
guardianTargetStatus=false, 
executionerTargetStatus=false, 
roleblockStatus=false}, 

{number=3, role=Arsonist, 
deathStatus=false, 
guardianTargetStatus=false, 
executionerTargetStatus=false, 
roleblockStatus=false}
]

Во всем моем коде мне нужно вызвать некоторые данные из этого массива. Например

var roleList = playersArray.map(function(role) {return role.role;});
Browser.msgBox(playersArray[1]["role"]);

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

Поэтому я установил playerArray как свойство в GS

PropertiesService.getScriptProperties().setProperty('playersArray', JSON.stringify(playersArray)); 

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

var playersArray = PropertiesService.getScriptProperties().getProperty('playersArray'); 
  playersArray = playersArray.replace(/\"/g, "").replace(/\:/g, "=");
  playersArray = playersArray.split(",");

По какой-то причине функция не может правильно видеть массив, когда я это делаю:

var roleList = playersArray.map(function(role) {return role.role;});
Browser.msgBox(playersArray[1]["role"]);

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

1 Ответ

1 голос
/ 29 апреля 2019
  • Вы хотите поместить объект массива в PropertiesService.
  • Когда вы извлекаете объект массива из PropertiesService, вы хотите использовать playersArray в качестве объекта массива.

Если мое понимание верно, как насчет этой модификации?

От:

var playersArray = PropertiesService.getScriptProperties().getProperty('playersArray');
playersArray = playersArray.replace(/\"/g, "").replace(/\:/g, "=");
playersArray = playersArray.split(",");

До:

var playersArray = PropertiesService.getScriptProperties().getProperty('playersArray');
playersArray = JSON.parse(playersArray);

Примечание:

  • Пожалуйста, будьте осторожны с квотами на PropertiesService.
    • Размер значения свойств равен 9 КБ / val
    • Общий объем хранилища составляет 500 КБ / хранилище свойств
  • Я думал, что в вашем сценарии playersArray можетбыть как var playersArray = [{number: 1, role: "Arsonist", deathStatus: false, guardianTargetStatus: false, executionerTargetStatus: false, roleblockStatus: false},,,].Потому что до того, как объект помещен в PropertiesService, Browser.msgBox(playersArray[1]["role"]) работает.И когда вы видите playersArray по Logger.log(playersArray), вы можете увидеть как var playersArray = [{number=1, role=Arsonist, deathStatus=false, guardianTargetStatus=false, executionerTargetStatus=false, roleblockStatus=false},,,].Когда playersArray является объектом, когда объект виден Logger.log(playersArray), : преобразуется в =.Я думаю, что это спецификация Google Apps Script.Таким образом, объект, помещенный в PropertiesService с использованием JSON.stringify(), может быть преобразован в объект с использованием JSON.parse().

Ссылки:

Если я неправильно понял ваш вопрос, прошу прощения.

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