Создание новых электронных таблиц из электронных таблиц - PullRequest
0 голосов
/ 28 апреля 2020

Я создаю лист, который может создать серию листов, которые взаимодействуют, чтобы помочь запустить симуляцию. Часть этого проекта включает в себя создание серии листов - отдельных таблиц оценок, к которым могут обращаться только отдельные игроки в игре. Код, который я надеюсь использовать, приведен ниже, но я столкнулся с рядом проблем. Во-первых, это говорит о том, что у меня нет разрешения на запуск SpreadsheetApp.create. Я потратил около часа, чтобы посмотреть, как это можно вылечить, но просто не понимаю и не могу найти хороший ответ. Вторая, и потенциально более широкая проблема, заключается в том, что использование GAS кажется невероятно сложным для взаимодействия с различными электронными таблицами (т.е. не внутри одной электронной таблицы). На более позднем этапе проекта нам потребуется извлечь информацию из этих листов, например, c. и если это будет трудно сделать с помощью сценариев, возможно, придется подумать об обходном пути.

/** @OnlyCurrentDoc */
function individualSheets(){
  var playerarray = playerArray();
  var spreadsheet = SpreadsheetApp.getActive();
  var spreadsheetlinks = []
  //creates individual sheet for each player, then adds the link of their sheet to a list
  for(i=0;i<playerarray.length;i++){
    var spreadsheetname = playerarray[i];
    var newspreadsheet = SpreadsheetApp.create(spreadsheetname);
    spreadsheetlinks.push(DriveApp.getUrl(newspreadhseet));
  }
  //pasting the links of each player in the appropriate sheet
  for(i=0;i<spreadsheetlinks.length;i++){
    spreadsheet.setActiveSheet("PlayerInfo").getRange('D'+(i+1)).activate()
    spreadsheet.getCurrentCell.setValue(spreadhseetlinks[i])
  }
}

1 Ответ

0 голосов
/ 29 апреля 2020

Apps Script не испытывает затруднений при использовании нескольких таблиц в одном скрипте. Я бы добавил еще один массив для хранения Ids , поэтому вам не придется получать их из URL:

var spreadsheetlinks = []
var spreadsheetIds = [];
  //creates individual sheet for each player, then adds the link of their sheet to a list
  for(i=0;i<playerarray.length;i++){
    var spreadsheetname = playerarray[i];
    var newspreadsheet = SpreadsheetApp.create(spreadsheetname);
    spreadsheetlinks.push(DriveApp.getUrl(newspreadhseet));
    spreadsheetIds.push(newspreadsheet.getId);
  }

Вы можете открыть таблицы, используя openById , поэтому вы можете использовать их неограниченное количество:

var sprSheet1 = SpreadsheetApp.openById('id 1');
var sprSheet2 = SpreadsheetApp.openById('id 2');
var sprSheet3 = SpreadsheetApp.openById('id 3');
...

или даже лучше:

var sprSheets = [];
for (var j = 0; j < spreadsheetIds.length; j++){

   sprSheets.push(SpreadsheetApp.openById(spreadsheetIds[j]);

}

Относительно проблемы SpreadsheetApp.create , убедитесь, что вы авторизовали необходимые области:

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

https://www.googleapis.com/auth/spreadsheets.currentonly https://www.googleapis.com/auth/spreadsheets

Вы можете проверить их в скрипте приложений View > Manifest file. Если вы никогда не касались этого , они не будут отображаться. Вы можете добавить их вручную:

"oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/drive.file"
  ]

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

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