【发布时间】:2019-02-20 11:34:10
【问题描述】:
我有一个运行良好并创建 Google Doc 的 Web 应用程序。该应用程序安装在新 Google 站点上的按钮中。有时,我需要从站点创建一个新文档,但有时我需要在打开 Google 电子表格时创建一个新文档(该表包含与站点相关的数据并且嵌入在站点中)。
我在该工作表上有一个自定义菜单,可以执行许多不同的操作。我想在该菜单中添加一个项目,以访问并运行上述 Web 应用程序。
首先:这可能吗?
其次,我假设如果可能的话,我必须以某种方式使用其 URL 调用 Web App 脚本(就像我使用它附加到我的 Google 站点上的按钮一样)。
我的网络应用代码如下:
代码.gs
function doGet() {
return HtmlService
.createTemplateFromFile('Index')
.evaluate();
}
function createNewLandscapeSong(objArgs) {
var docName = objArgs.docName;
var songTitle = objArgs.songTitle;
var songWriters = objArgs.songWriters;
Logger.log('songTitle: ' + 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);
return {
url: url,
songTitle: songTitle
};
}
索引.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
Fill in fields below to name Google Lyric Document<br>
and add the song title and writers.<br>
Then click button to create new song lyric docunent.<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)
.createNewLandscapeSong({docName:docName,songTitle:songTitle, songWriters: songWriters})
}
function openNewDoc(results){
window.open(results.url, '_blank').focus();
}
</script>
</body>
</html>
绑定脚本:SP 目录菜单
/*This menu in use.
This function creates the custom menu. Note: Line 3 throws error, but this script works.*/
function onOpen() {
//SpreadsheetApp.getActiveSpreadsheet().toast('Task started');
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 - Landscape', 'createLandscapeLyricDoc')
.addItem('New Lyric - Landscape Test', 'newLyricTest')
.addItem('New Lyric - Portrait', 'openPortrait')
.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 createLandscapeLyricDoc() {
var doc = DocumentApp.create('Rename');
var title = "replace with song title and then link this text to song title cell in Catalog Spreadsheet"
var url = doc.getUrl();
var body = doc.getBody();
var paragraph = body.insertParagraph(0, "");
var text1 = paragraph.appendText("© replace with writer(s)");
text1.setFontSize(8);
var rowsData = [['PUT FIRST VERSE/CHORUS HERE. (SUGGEST USE ALL CAPS.)', 'PUT SECOND VERSE/NEXT CHORUS/BRIDGE/ETC HERE.']];
var style = {};
body.insertParagraph(0, title)
.setHeading(DocumentApp.ParagraphHeading.HEADING3);
table = body.appendTable(rowsData);
style[DocumentApp.Attribute.BORDER_WIDTH] = 0;
table.setAttributes(style);
var html = '<a href= "' + url + '"; target="_blank">Open new lyric doc</a>;'
var selection = SpreadsheetApp.getActiveSheet();
var userInterface = HtmlService.createHtmlOutput(html);
/*Note: The following line throws error when you debug,
but the script works from the Catalog Sheet SP Menu.*/
SpreadsheetApp.getUi().showModalDialog(userInterface, 'Open Landscape New Lyric Doc');
}
function newLyricTest() {
// This is where I want to put call to run the SPSiteNewSongButtonScript (Web App)
}
function openPortrait() {
var html = "<a href= 'url'; target='_blank'>Open 1-Column Lyric Template</a>";
var selection = SpreadsheetApp.getActiveSheet();
var userInterface = HtmlService.createHtmlOutput(html);
SpreadsheetApp.getUi().showModalDialog(userInterface, 'Open Portrait New Lyric Doc');
}
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);
}
【问题讨论】:
-
您的问题非常模棱两可,无法像目前所问的那样清楚地回答。首先,Web 应用程序在创建新的 Google 文档时实际在做什么(例如,它是否从用户那里获取价值?)。其次,您是否厌倦了在 Google 表格中重新创建/复制网络应用程序代码?如果这是一次性的,这可能是最简单的方法
-
第二个问题,首先:我没有尝试将 Google Web App 重新创建/复制到绑定脚本中,因为 Web App 由 code.gs (doGet) 段和 index.html 段组成,我是'不知道/不知道如何在绑定脚本中实现它们。此外,我希望有一个简单的“调用”可以在绑定脚本中执行以运行 Web 应用程序。
-
1Q:我会将Web App和绑定脚本代码添加到问题中以解决歧义问题。
标签: google-apps-script google-sheets web-applications