getSheets () Google Apps Script проблема с несколькими вызовами - PullRequest
1 голос
/ 23 марта 2020

(Для целей этого поста я буду ссылаться на каждый «лист» в электронной таблице Google как на вкладку, я считаю, что соглашение об именах вводит в заблуждение при чтении)

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

По любой причине, всякий раз, когда я вызываю getSheets() функция более одного раза, возвращаемое значение от вызова является таким же, как и то, что возвращение было от первого вызова. Например, если у меня было 3 вкладки с именем «первая, вторая, третья» и я запустил прикрепленный код, sheetList правильно возвращается как [first, second, third]. Но, скажем, во время for l oop добавляется вкладка (в результате связывания формы), и я затем снова вызываю getSheets(), чтобы получить новую первую вкладку (должны быть связаны данные формы), что все еще возвращает [first]

Не знаете, откуда go, это проблема со скриптом приложения? Или мой подход? Любые советы или рекомендации будут оценены.

    const separateSheetNames = [
    "English Household Information",
    "English Camper Information",
    "English Parent Signatures",
    "English Household Number Recovery",
    "Spanish Household Information",
    "Spanish Camper Information",
    "Spanish Parent Signatures",
    "Spanish Household Number Recovery"
  ];
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetList = []
  ss.getSheets().forEach(function(val){sheetList.push(val.getName())});

  for (i=0;i<separateSheetNames.length;i++){
    var ui = SpreadsheetApp.getUi();
    var currentSheetName = separateSheetNames[i]
    var isAlreadySheet = sheetList.indexOf(currentSheetName)

    if (isAlreadySheet == -1){
      var formUrl = ui.prompt('Paste the link for the ' + currentSheetName + ' form').getResponseText()
      var form = FormApp.openByUrl(formUrl)
      const ssId = ss.getId();
      form.setDestination(FormApp.DestinationType.SPREADSHEET, ssId)
      var firstsheet = ss.getSheets()[0]
      console.log('firstSheetName ' + firstsheet.getName())
      firstsheet.setName(currentSheetName)
      var currentSheetLastCol = ss.getSheetByName(currentSheetName).getLastColumn()+1
      ss.getSheetByName(currentSheetName).getRange(1,currentSheetLastCol).setValue('Row in Combined Data')
    }
  }

1 Ответ

2 голосов
/ 23 марта 2020

Оставьте это для всех, кто может столкнуться с подобной проблемой - решение, предлагаемое @TheMaster, отлично работает:

, попробуйте SpreadsheetApp.flush() до getSheets() вызова.

...