Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.23 KB | None | 0 0
  1. var ADDON_TITLE = "Forms to Docs";
  2.  
  3. var NOTICE = "NOTICE";
  4.  
  5. /**
  6. * Adds a custom menu to the active form to show the add-on sidebar.
  7. *
  8. * @param {object} e The event parameter for a simple onOpen trigger. To
  9. * determine which authorization mode (ScriptApp.AuthMode) the trigger is
  10. * running in, inspect e.authMode.
  11. */
  12. function onOpen(e) {
  13. FormApp.getUi()
  14. .createAddonMenu()
  15. // .createMenu()
  16. .addItem("Configure", "showSidebar")
  17. .addItem("About", "showAbout")
  18. .addToUi();
  19. }
  20.  
  21. /**
  22. * Runs when the add-on is installed.
  23. *
  24. * @param {object} e The event parameter for a simple onInstall trigger. To
  25. * determine which authorization mode (ScriptApp.AuthMode) the trigger is
  26. * running in, inspect e.authMode. (In practice, onInstall triggers always
  27. * run in AuthMode.FULL, but onOpen triggers may be AuthMode.LIMITED or
  28. * AuthMode.NONE).
  29. */
  30. function onInstall(e) {
  31. onOpen(e);
  32. // deleteAllTriggers();
  33. createSpreadsheetOpenTrigger();
  34. }
  35.  
  36. /**
  37. * Opens a sidebar in the form containing the add-on's user interface for
  38. * configuring the notifications this add-on will produce.
  39. */
  40. function showSidebar() {
  41. var ui = HtmlService.createHtmlOutputFromFile("Sidebar").setTitle(
  42. "Forms to Docs"
  43. );
  44. FormApp.getUi().showSidebar(ui);
  45. }
  46.  
  47. /**
  48. * Opens a purely-informational dialog in the form explaining details about
  49. * this add-on.
  50. */
  51. function showAbout() {
  52. var ui = HtmlService.createHtmlOutputFromFile("About")
  53. .setWidth(420)
  54. .setHeight(270);
  55. FormApp.getUi().showModalDialog(ui, "About Form Notifications");
  56. }
  57.  
  58. /**
  59. * Save sidebar settings to this form's Properties, and update the onFormSubmit
  60. * trigger as needed. Called by Sidebar on user input.
  61. *
  62. * @param {Object} settings An Object containing key-value
  63. * pairs to store.
  64. */
  65. function saveSettings(settings) {
  66. PropertiesService.getDocumentProperties().setProperties(settings);
  67. }
  68.  
  69. /**
  70. * Queries the User Properties and adds additional data required to populate
  71. * the sidebar UI elements.
  72. *
  73. * @return {Object} A collection of Property values and
  74. * related data used to fill the configuration sidebar.
  75. */
  76. function getSettings() {
  77. var settings = PropertiesService.getDocumentProperties().getProperties();
  78.  
  79. // Use a default email if the creator email hasn't been provided yet.
  80. if (!settings.creatorEmail) {
  81. settings.creatorEmail = Session.getEffectiveUser().getEmail();
  82. }
  83.  
  84. // Get text field items in the form and compile a list of their titles and IDs.
  85. var form = FormApp.getActiveForm();
  86. var textItems = form.getItems(FormApp.ItemType.TEXT);
  87. settings.textItems = [];
  88. for (var i = 0; i < textItems.length; i++) {
  89. settings.textItems.push({
  90. title: textItems[i].getTitle(),
  91. id: textItems[i].getId()
  92. });
  93. }
  94.  
  95. PropertiesService.getDocumentProperties()
  96. .getKeys()
  97. .forEach(function callback(value) {
  98. Logger.log(value);
  99. });
  100.  
  101. return settings;
  102. }
  103.  
  104. // usage, settings.getProperty("SettingA") == "true";
  105. /**
  106. * Responds to a form submission event if an onFormSubmit trigger has been
  107. * enabled. BROKE SAVED FOR REFERENCE
  108. *
  109. * @param {Object} e The event parameter created by a form
  110. * submission; see
  111. * https://developers.google.com/apps-script/understanding_events
  112. */
  113. // var settings = PropertiesService.getDocumentProperties();
  114. // var authInfo = ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL);
  115. // if (
  116. // authInfo.getAuthorizationStatus() == ScriptApp.AuthorizationStatus.REQUIRED
  117. // ) {
  118. // sendReauthorizationRequest();
  119. // } else {
  120. // if (settings.getProperty("creatorNotify") == "true") {
  121. // sendCreatorNotification();
  122. // }
  123. // if (
  124. // settings.getProperty("respondentNotify") == "true" &&
  125. // MailApp.getRemainingDailyQuota() > 0
  126. // ) {
  127. // sendRespondentNotification(e.response);
  128. // }
  129. // }
  130. // }
  131.  
  132. /**
  133. * Creates a google document representation of each entry into a google forms. Automatically stores google documents in folder.
  134. */
  135. function exportRecentAsDoc() {
  136. // SETUP
  137. var form = FormApp.getActiveForm();
  138. var d = new Date(); // create date object (for testing purposes)
  139.  
  140. // READ FORM ENTRIES
  141. // parse, to get last row's data and all questions
  142. var titles = [];
  143. form.getItems().forEach(function(item, index) {
  144. titles[index] = item.getTitle();
  145. });
  146.  
  147. if (form.getResponses().length != 0) {
  148. var latestResponses = form
  149. .getResponses()
  150. [form.getResponses().length - 1].getItemResponses();
  151. } else {
  152. var latestResponses = [];
  153. }
  154.  
  155. // MAKE DOCUMENT
  156. // create doc
  157. var doc = DocumentApp.create(form.getItems[0] + " " + form.getItems[1]);
  158. // save to folder
  159. if (!DriveApp.getFoldersByName(form.getTitle() + " (Documents)").hasNext()) {
  160. // if doesn't exist, create it
  161. DriveApp.createFolder(form.getTitle() + " (Documents)");
  162. }
  163. var folder = DriveApp.getFoldersByName(
  164. form.getTitle() + " (Documents)"
  165. ).next();
  166. folder.addFile(DriveApp.getFileById(doc.getId())); // creates second reference to same file
  167. // remove from root (default) folder, which was automatically placed there on creation
  168. DriveApp.getRootFolder().removeFile(DriveApp.getFileById(doc.getId()));
  169.  
  170. // FILL DOCUMENT
  171. var body = doc.getBody();
  172. // format style
  173. headerStyle = {};
  174. // headerStyle[DocumentApp.Attribute.FONT_SIZE] = 18;
  175. // headerStyle[DocumentApp.Attribute.BOLD] = true;
  176. headerStyle[DocumentApp.Attribute.BOLD] = true;
  177. headerStyle[DocumentApp.Attribute.UNDERLINE] = true;
  178. bodyStyle = {};
  179. bodyStyle[DocumentApp.Attribute.BOLD] = false;
  180. bodyStyle[DocumentApp.Attribute.UNDERLINE] = false;
  181. latestResponses.forEach(function(currentValue, index) {
  182. body.appendParagraph("" + titles[index]).setAttributes(headerStyle);
  183. body
  184. .appendParagraph("" + latestResponses[index].getResponse())
  185. .setAttributes(bodyStyle);
  186. // TODO handle formatting types: a String or String[] or String[][] of answers to the question item
  187. body.appendParagraph("");
  188. });
  189.  
  190. // Write log to spreadsheet
  191.  
  192. var settings = PropertiesService.getDocumentProperties();
  193. if (settings.getProperty("exportToSheet")) {
  194. if (!settings.getProperty("sheetURL") || settings.getProperty("sheetURL").trim() === '') {
  195. var ss = SpreadsheetApp.create(form.getTitle() + " (Document Links)");
  196. settings.setProperty("sheetURL", ss.getUrl());
  197. saveSettings();
  198. } else {
  199. var ss = SpreadsheetApp.openByUrl(settings.getProperty("sheetURL"));
  200. }
  201. ss.getActiveSheet().appendRow([doc.getUrl()]);
  202. }
  203. }
  204.  
  205. /**
  206. * Creates a trigger for when form entered.
  207. */
  208. function createSpreadsheetOpenTrigger() {
  209. var form = FormApp.getActiveForm();
  210. try {
  211. deleteAllTriggers();
  212. ScriptApp.newTrigger("exportRecentAsDoc")
  213. .forForm(form)
  214. .onFormSubmit()
  215. .create();
  216. } catch (error) {
  217. SpreadsheetApp.getUi().alert("Confirmation received.");
  218. }
  219. }
  220.  
  221. /**
  222. * Deletes all triggers.
  223. */
  224. function deleteAllTriggers() {
  225. // Loop over all triggers.
  226. var allTriggers = ScriptApp.getProjectTriggers();
  227. for (var i = 0; i < allTriggers.length; i++) {
  228. // remove triggers
  229. ScriptApp.deleteTrigger(allTriggers[i]);
  230. }
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement