При открытии Google Spreadsheet из Google Web App, что управляет видимой частью таблицы (в веб-браузере)? - PullRequest
0 голосов
/ 25 февраля 2019

Следующий код открывает электронную таблицу.Что странно, это та часть сс, которая видна.У ss есть около 430 строк (я говорю «около», так как скрипт добавляет строки, поэтому, сколько он имеет в любой момент времени, зависит от того, сколько тестов я выполнил для скрипта и сколько из этих тестовых строк я удалил).Но, независимо от того, сколько строк имеет ss или какие строки видны до того, как я запустил скрипт, или где курсор находится на ss, прежде чем я запустил скрипт;когда скрипт запускается, когда открывается первый ss, верхняя часть ss видна (на рисунке ниже), а затем, когда ss все еще загружается (работает), страница перерисовывается и строка 396 (или 397, 398 и т. д.,в зависимости от того, сколько тестов я выполнил и / или удалил) всегда первая видимая строка (также на рисунке).

Существует сценарий «onOpen», который влияет на ss (создает меню), и в порядкечтобы исключить это как фактор в ваших умах, это также перепечатано ниже.

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

Code.gs

function doGet() {
  return HtmlService
      .createTemplateFromFile('Index')
      .evaluate();
}
function addSong(objArgs) {
    var id= "1-yN6yAGUuOp84apeN2Cwaq25rPD63qb_m2Oe-MSMaIM"
    var ss = SpreadsheetApp.openById(id);
    var url = ss.getUrl();
    var sheet = ss.getActiveSheet();
    var lastRow = sheet.getLastRow()
    sheet.appendRow([lastRow+1]);
    SpreadsheetApp.flush();
    var range = sheet.getRange(sheet.getLastRow(), 1);
    var songTitle = objArgs.songTitle;
    var namedRange = sheet.getRange("Title");
    var newRange = sheet.getRange(sheet.getLastRow(), namedRange.getColumn())
    var newLastRow = lastRow+1
    newRange.setValue(songTitle);
    url = url + "#gid=1286827341" + "&range=" + newLastRow + ":" + newLastRow;
    Logger.log('url: ' + url)

    return url;
}

Index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
<br>Fill in field below with Song Title.<br>
Then click button to add new song to Catalog.<br><br>
    <input id="idSongTitle" type="text" placeholder="Song Title"><br><br>
    <button onclick="saveUserInput()">Add song to Catalog</button>    

    <script>
      window.saveUserInput = function() {
        var songTitle = document.getElementById('idSongTitle').value;
        console.log('songTitle: ' + songTitle)
        google.script.run       
          .withSuccessHandler(openCatalog)
          .addSong({songTitle:songTitle})
      }
       function openCatalog(url){
       window.open(url);
       }
    </script>
  </body>
</html>

Связанный скрипт

Code.gs

/*This menu in use.

This function creates the custom menu. Note: Line 3 throws error, but this script works.*/
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('SP')
      .addItem('Website', 'openSite')
      .addItem('Open Google Drive', 'openDrive')
      .addItem('Open Old SP Site', 'openOldSP')
      .addItem('Create', 'openCreate')
      .addItem('Perform', 'openPerform')
      .addItem('Catalog', 'openCatalog')
      .addItem('New Lyric', 'newLyric')
      .addItem('Add Song to Catalog', 'addSong')
      .addToUi();
}
function openSite() {
  var selection = SpreadsheetApp.getActiveSheet();
  var html = "<a href='https://sites.google.com/view/sp-site/catalog'; target='_blank'>Open SP</a>";
  var userInterface = HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModalDialog(userInterface, 'Open SP');
  }
function openDrive() {
  var selection = SpreadsheetApp.getActiveSheet();
  var html = "<a href='https://drive.google.com/drive/my-drive'; target='_blank'>Open My Google Drive</a>";
  var userInterface = HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModalDialog(userInterface, 'Open My Google Drive');
  }
function openOldSP() {
  var selection = SpreadsheetApp.getActiveSheet();
  var html = "<a href='url'; target='_blank'>Open Old SP Site</a>";
  var userInterface = HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModalDialog(userInterface, 'Open My Google Drive');
  }
function openCreate() {
  var selection = SpreadsheetApp.getActiveSheet();
  var html = "<a href='url'; target='_blank'>Open Create Spreadsheet</a>";
  var userInterface = HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModalDialog(userInterface, 'Open Create Sheet');
}
function openPerform() {
  var selection = SpreadsheetApp.getActiveSheet();
  var html = "<a href= 'url'; target='_blank'>Open Perform Spreadsheet</a>";
  var userInterface = HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModalDialog(userInterface, 'Open Perform Sheet');
}
function newLyric() {
  var html = HtmlService.createHtmlOutputFromFile('Index')
      .setTitle('Create New Landscape Lyric')
      .setWidth(300);
  SpreadsheetApp.getUi()
      .showSidebar(html);
}
function createNewLandscapeLyric(objArgs) {
  var docName = objArgs.docName;
  var songTitle = objArgs.songTitle;
  var songWriters = objArgs.songWriters;
  Logger.log(songTitle)
  var doc = DocumentApp.create(docName);
  var url = doc.getUrl();
  var body = doc.getBody();
  var paragraph = body.insertParagraph(0, "");
  var text = paragraph.appendText("© "+songWriters);
  text.setFontSize(8);
  var rowsData = [['PUT FIRST VERSE/CHORUS HERE.', 'PUT SECOND VERSE/NEXT CHORUS/BRIDGE/ETC HERE.']];
  var style = {};
  body.insertParagraph(0, songTitle)
  .setHeading(DocumentApp.ParagraphHeading.HEADING3);
  table = body.appendTable(rowsData);
  style[DocumentApp.Attribute.BORDER_WIDTH] = 0;
  table.setAttributes(style);
  Logger.log(url)
  return {
   url: url
  };
}

function addSong() {
    var ss = SpreadsheetApp.getActive();
    var sheet = ss.getActiveSheet();
    var lastRow = sheet.getLastRow()
    sheet.appendRow([lastRow+1]);
    SpreadsheetApp.flush();
    var range = sheet.getRange(sheet.getLastRow(), 1);
    var songTitle = Browser.inputBox('New Song', 'Enter the song title', Browser.Buttons.OK_CANCEL);
    var namedRange = sheet.getRange("Title");
    var range=sheet.getRange(sheet.getLastRow(), namedRange.getColumn())
    range.setValue(songTitle);
    SpreadsheetApp.setActiveRange(range);
}

Index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
Fill in fields below to name Google Lyric Document and add the song title and writers. Then click button to create new song lyric document.<br><br>
    <input id="idNewDocName" type="text" placeholder="Google Doc Name"><br><br>
    <input id="idNewSongTitle" type="text" placeholder="Song Title"><br><br>
    <input id="idNewSongWriters" type="text" placeholder="Song Writers"><br><br>
    <button onclick="saveUserInput()">Create New Lyric Doc</button>
    <script>
      window.saveUserInput = function() {
        var docName = document.getElementById('idNewDocName').value;
        var songTitle = document.getElementById('idNewSongTitle').value;
        var songWriters = document.getElementById('idNewSongWriters').value;
        console.log('songTitle: ' + songTitle)
        google.script.run       
          .withSuccessHandler(openNewDoc)
          .createNewLandscapeLyric({docName:docName,songTitle:songTitle, songWriters: songWriters})
      }
       function openNewDoc(results){
           window.open(results.url, '_blank').focus();
       }
    </script>
  </body>
</html>

Окно браузера электронной таблицы при ssсначала открывается

[! [введите описание изображения здесь] [1]] [1]

Окно браузера окончательной таблицы

[! [8] [2]] [2]

Нижняя часть электронной таблицы (и, кстати, часть сс, которую я хотел бы видеть в окне браузера, когда веб-приложение работает).

(изображения удалены)

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Решение для новой строки не видно:

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

Code.gs

function doGet() {
  return HtmlService
      .createTemplateFromFile('Index')
      .evaluate();
}
function addSong(objArgs) {
    var id= "1-yN6yAGUuOp84apeN2Cwaq25rPD63qb_m2Oe-MSMaIM";
    var ss = SpreadsheetApp.openById(id);
    var ssUrl = ss.getUrl();
    var sheet = ss.getActiveSheet();
    var sheetId = sheet.getSheetId();
    var url = ssUrl + "#gid=" + sheetId;
    var lastRow = sheet.getLastRow(); //this gets last row at this point in code. "Last row" is defined as last row with content.
    sheet.appendRow([lastRow+1]); //gets prior number and adds 1 row
    SpreadsheetApp.flush();
    var songTitle = objArgs.songTitle; //this pulls the songTitle variable value from Index.html
    var row = sheet.getLastRow(); //this gets row # after new row added
    var colRange = sheet.getRange("Title"); //this gets the Title named column
    var col = colRange.getColumn(); //this gets col # of Title column
    var cell = sheet.getRange(row, col); //this gets the cell reference at the intersection of row and col
    cell.setValue(songTitle);//this puts the songTitle variable value into cell
    var newSongRow = lastRow+1; 
    var C1 = '!C1'; //gets the value in cell C1 calculated on the spreadsheet for the last empty row in column A.
    var lastEmptyRow = sheet.getRange(C1).getValue();
    var padsNeeded = 5; //minimum number of "padded" rows required to force browser window to display the new song row.
    var dif = lastEmptyRow - newSongRow;
    var padChange = padsNeeded-dif;
    var padChangePos = Math.abs(padChange);  
    Logger.log("newSongRow = " + newSongRow);
    Logger.log("lastEmptyRow = " + lastEmptyRow);
    Logger.log("padsNeeded = " + padsNeeded);
    Logger.log("dif = " + dif);
    Logger.log("padChange = " + padChange);
    Logger.log("padChangePos = " + padChangePos);

    if(padChange > 0){
       sheet.insertRowsAfter(newSongRow, padChangePos); 
    } else if (padChange < 0) {
       sheet.deleteRows(newSongRow+1, padChangePos); 
    } 

    var catalogSongsSheet = url + "&range=" + newSongRow + ":" + newSongRow;
    return catalogSongsSheet;


}

Index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
<br><center>Fill in field below with Song Title.Then click button to add new song to Catalog.<br><br>
    <input id="idSongTitle" type="text" placeholder="Song Title"><br><br>
    <button onclick="saveUserInput()">Add song to Catalog</button> </center>   

    <script>
      window.saveUserInput = function() {
        var songTitle = document.getElementById('idSongTitle').value;
        console.log('songTitle: ' + songTitle)
        google.script.run       
          .withSuccessHandler(openCatalog)
          .addSong({songTitle:songTitle})
      }
       function openCatalog(url){
       window.open(url);
       }
    </script>
  </body>
</html>
0 голосов
/ 26 февраля 2019

Поскольку после вашего активного диапазона не было пустых строк, прокрутка остановилась на гораздо более высокой строке (строка 398).Добавьте дополнительные строки в конце, чтобы автоматически прокрутить до нужного диапазона с помощью URL.

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