Gewusst wie: übergeben Sie parameter an html?

Ich habe ein Skript, das die Datei verwendet picker, aber ich übergeben zu müssen, einen bestimmten parameter, die aufgerufen wird, userId und gehalten wird wie eine Globale variable in der aufrufenden Skript. Als die Aufrufe sind asynchron, es scheint ich kann nicht auf diese parameter. Ist es Weg, um den Zugriff auf die parameter aus der html-Datei, oder übergeben Sie diesen parameter, um die html?

Ich könnte mischen und vorgefertigte html-und nicht Vorlagen (d.h. https://developers.google.com/apps-script/guides/html/templates und https://developers.google.com/apps-script/guides/html/) aber ich brauche, um dieses Problem zu lösen.

Jede Hilfe dankbar.

Hier ist der aufrufende code (eingeleitet durch ein Menü-Element in einer Tabellenkalkulation):

function syncStudentsFile(userId, ss) {
  scriptUser_(userId);  //save userId
  Logger.log('SRSConnect : syncStudentsFile : userId:'+userId);  //userId is correct here
  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var html = HtmlService.createHtmlOutputFromFile('PickerSync.html')
    .setWidth(600).setHeight(425);
  SpreadsheetApp.getUi().showModalDialog(html, 'Select a file');
}

function scriptUser_(userId) {
  if (userId !== undefined)
    sUserId = userId; //Global variable
  try { return sUserId; } catch (e) { return undefined; }
}

function getOAuthToken() {  //used by Picker
  DriveApp.getRootFolder();
  return ScriptApp.getOAuthToken();
}

Hier ist der html-picker-Datei:

<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">

<script type="text/javascript">
  var DEVELOPER_KEY = '..............';
  var DIALOG_DIMENSIONS = {width: 600, height: 425};
  var pickerApiLoaded = false;

  /**
   * Loads the Google Picker API.
   */
  gapi.load('picker', {'callback': function() {
    pickerApiLoaded = true;
  }});

  /**
   * Gets the user's access token from the server-side script so that
   * it can be passed to Picker. This technique keeps Picker from needing to
   * show its own authorization dialog, but is only possible if the OAuth scope
   * that Picker needs is available in Apps Script. Otherwise, your Picker code
   * will need to declare its own OAuth scopes.
   */
  function getOAuthToken() {
    google.script.run.withSuccessHandler(createPicker)
        .withFailureHandler(showError).getOAuthToken();
  }

  /**
   * Creates a Picker that can access the user's spreadsheets. This function
   * uses advanced options to hide the Picker's left navigation panel and
   * default title bar.
   *
   * @param {string} token An OAuth 2.0 access token that lets Picker access the
   *     file type specified in the addView call.
   */
  function createPicker(token) {
    if (pickerApiLoaded && token) {
      var uploadView = new google.picker.DocsUploadView();
      var picker = new google.picker.PickerBuilder()
          //Instruct Picker to display only spreadsheets in Drive. For other
          //views, see https://developers.google.com/picker/docs/#otherviews
          .addView(google.picker.ViewId.DOCS)
          .addView(google.picker.ViewId.RECENTLY_PICKED)
          .addView(uploadView)
          .hideTitleBar()
          .setOAuthToken(token)
          .setDeveloperKey(DEVELOPER_KEY)
          .setCallback(pickerCallback)
          //Instruct Picker to fill the dialog, minus 2 pixels for the border.
          .setSize(DIALOG_DIMENSIONS.width - 2,
              DIALOG_DIMENSIONS.height - 2)
          .build();
      picker.setVisible(true);
    } else {
      showError('Unable to load the file picker.');
    }
  }

  /**
   * A callback function that extracts the chosen document's metadata from the
   * response object. For details on the response object, see
   * https://developers.google.com/picker/docs/result
   *
   * @param {object} data The response object.
   */
  function pickerCallback(data) {
    var action = data[google.picker.Response.ACTION];
    if (action == google.picker.Action.PICKED) {
      var doc = data[google.picker.Response.DOCUMENTS][0];
      var id = doc[google.picker.Document.ID];
      google.script.host.close();
      //--------------> user global parameter sUserId set earlier
      google.script.run.PickerSyncFile(sUserId, id);
    } else if (action == google.picker.Action.CANCEL) {
      google.script.host.close();
    }
  }

  /**
   * Displays an error message within the #result element.
   *
   * @param {string} message The error message to display.
   */
  function showError(message) {
    document.getElementById('result').innerHTML = 'Error: ' + message;
  }
</script>

<div>
  <script>getOAuthToken()</script>
  <p id='result'></p>
  <input type="button" value="Close" onclick="google.script.host.close()" />
</div>

Hier ist die picker-code:

function pickerSyncFile(userId, id) {
  Logger.log('userId:'+userId);  //BUG: it is null
  Logger.log('id:'+id);  //id returned well from picker

  //rest of code here but userId was is incorrect
}

InformationsquelleAutor theworldismyoyster | 2015-05-04

Schreibe einen Kommentar