Skip to content

Instantly share code, notes, and snippets.

@nutanc
Created August 12, 2020 16:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nutanc/ef19c3cbdf9eb3c8dae7456c786465b2 to your computer and use it in GitHub Desktop.
Save nutanc/ef19c3cbdf9eb3c8dae7456c786465b2 to your computer and use it in GitHub Desktop.
/**
* @OnlyCurrentDoc Limits the script to only accessing the current presentation.
*/
/**
* Create a open translate menu item.
* @param {Event} event The open event.
*/
function onOpen(event) {
SlidesApp.getUi().createAddonMenu()
.addItem('Open GPT Helper', 'showSidebar')
.addToUi();
}
/**
* Open the Add-on upon install.
* @param {Event} event The install event.
*/
function onInstall(event) {
onOpen(event);
}
/**
* Opens a sidebar in the document containing the add-on's user interface.
*/
function showSidebar() {
var ui = HtmlService
.createHtmlOutputFromFile('sidebar')
.setTitle('GPT Helper');
SlidesApp.getUi().showSidebar(ui);
}
/**
* Recursively gets child text elements a list of elements.
* @param {PageElement[]} elements The elements to get text from.
* @return {Text[]} An array of text elements.
*/
function getElementTexts(elements) {
var texts = [];
elements.forEach(function(element) {
switch (element.getPageElementType()) {
case SlidesApp.PageElementType.GROUP:
element.asGroup().getChildren().forEach(function(child) {
texts = texts.concat(getElementTexts(child));
});
break;
case SlidesApp.PageElementType.TABLE:
var table = element.asTable();
for (var y = 0; y < table.getNumColumns(); ++y) {
for (var x = 0; x < table.getNumRows(); ++x) {
texts.push(table.getCell(x, y).getText());
}
}
break;
case SlidesApp.PageElementType.SHAPE:
texts.push(element.asShape().getText());
break;
}
});
return texts;
}
/**
* Translates selected slide elements to the target language using Apps Script's Language service.
*
* @param {string} targetLanguage The two-letter short form for the target language. (ISO 639-1)
* @return {number} The number of elements translated.
*/
function translateSelectedElements() {
// Get selected elements.
var selection = SlidesApp.getActivePresentation().getSelection();
var selectionType = selection.getSelectionType();
var texts = [];
switch (selectionType) {
case SlidesApp.SelectionType.PAGE:
var pages = selection.getPageRange().getPages().forEach(function(page) {
texts = texts.concat(getElementTexts(page.getPageElements()));
});
break;
case SlidesApp.SelectionType.PAGE_ELEMENT:
var pageElements = selection.getPageElementRange().getPageElements();
texts = texts.concat(getElementTexts(pageElements));
break;
case SlidesApp.SelectionType.TABLE_CELL:
var cells = selection.getTableCellRange().getTableCells().forEach(function(cell) {
texts.push(cell.getText());
});
break;
case SlidesApp.SelectionType.TEXT:
var elements = selection.getPageElementRange().getPageElements().forEach(function(element) {
texts.push(element.asShape().getText());
});
break;
}
var r='';
// Translate all elements in-place.
texts.forEach(function(text) {
var query = text.asRenderedString();
var url = 'URL_OF_OPEN_API'
+ '?'
+ 'text=' + encodeURIComponent(query);
var response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true});
r=r+response.getContentText();
console.log(response.getResponseCode());
Logger.log(response.getResponseCode());
text.setText("");
//text.setText(LanguageApp.translate(text.asRenderedString(), '', targetLanguage));
});
var data = JSON.parse(r);
console.log(data);
// Create a new square textbox, using the supplied element ID.
/*var url = 'https://d0fe0d9608f4.ngrok.io/get_presentation?'
+ '?'
+ 'text=' + encodeURIComponent(query);
var response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true});
console.log(response.getResponseCode());
Logger.log(response.getResponseCode());*/
var slide=SlidesApp.getActivePresentation().getSlides()[0];
var shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 200, 20, 500, 100);
var textRange = shape.getText();
var t=textRange.setText(data.title);
t.getTextStyle()
.setBold(true)
.setFontSize(48)
.setForegroundColor('#ff0000');
//t.insertParagraph(4, "para1");
//t.insertParagraph(4, "para2");
elems=data.elements;
for (i = 0; i < elems.length; i++) {
top=75+(i+1)*75;
var shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 50, top, 650, 75);
var textRange = shape.getText();
var t=textRange.setText(elems[i]);
t.getTextStyle()
.setBold(true)
.setFontSize(24)
.setForegroundColor('#000000');
}
/*var elementId = 'MyTextBox_01';
var pt350 = {
magnitude: 350,
unit: 'PT'
};
var requests = [
// Insert text into the box, using the supplied element ID.
{
insertText: {
objectId: SlidesApp.getActivePresentation().getSlides()[0],
insertionIndex: 0,
text: 'New Box Text Inserted!'
}
}];
// Execute the request.
var createTextboxWithTextResponse = SlidesApp.getActivePresentation().batchUpdate({
requests: requests
}, '1mUnOuadMjnZLPh_X8i1Glm8bcI02UIJj3Vis2D9PD44');
var createShapeResponse = createTextboxWithTextResponse.replies[0].createShape;
console.log('Created textbox with ID: %s', createShapeResponse.objectId);*/
return texts.length;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment