Google Apps脚本在新窗口中打开Goog​​le表格的副本

时间:2017-06-12 22:33:41

标签: javascript html google-apps-script

我正试图通过编写脚本来提高我的Google知识,并且我已经研究了高低,以便解决我的情况无济于事。

我有一张用作模板的Google表格。打开原始文件时,我想启动一个对话框来输入学生ID#。此数字将传递到模板中的指定单元格,这会在工作表中生成一些自动填充的单元格(使用电子表格函数)。填充单元格后,我想制作具有特定命名结构的文件副本,并将其存储在Google云端硬盘中的指定文件夹中。最后,我希望在新窗口中打开该新文件以进行进一步编辑。

到目前为止,我可以弹出ID#的对话框,我可以将该号码传递给工作表,我可以制作模板的副本并相应地重命名。

我不能做的是让新文件在新标签页中自动打开。我还需要新文件才能运行" onOpen"脚本。

以下是我迄今为止所做的每一项努力。

下面的代码会创建一个对话框,用于输入学生ID并将其传递到工作表到指定的单元格:

    function BuildUI() {
       var app = UiApp.createApplication();
       app.setTitle('Make a Copy - Please enter the Student ID# below:');
       var panel = app.createVerticalPanel();
       var textBox = app.createTextBox();
       textBox.setName('stuId').setId('StudentID');
       var button = app.createButton('Submit');
       panel.add(textBox);
       panel.add(button);
       var clickHandler = app.createServerClickHandler('responses');
       button.addClickHandler(clickHandler);
       clickHandler.addCallbackElement(panel);
       app.add(panel);
       var doc = SpreadsheetApp.getActive();
       doc.show(app);
    }

    function responses(e){
       var app = UiApp.getActiveApplication();
       var textBoxValue = e.parameter.stuId;
       var sheet = SpreadsheetApp.getActiveSheet();
       var studentID = sheet.getRange('Y4').setValue(textBoxValue);
       var dateToday = sheet.getRange('C5').setValue(new Date());
       return app.close();
    }

以上代码适用于我需要它做的事情。我只提供它以供参考(以及清理它的建议;)

下一个代码块会使用新值复制文件,将其重命名,并将其保存到Google云端硬盘中的指定文件夹中。再说一次......这对我有用,但我把它作为参考和建议:

    function makeCopy(){ 
       var sheet = SpreadsheetApp.getActiveSpreadsheet();
       var firstName = sheet.getRange('O4').getDisplayValue();
       var lastName = sheet.getRange('E4').getDisplayValue();
       var date = sheet.getRange('C5').getDisplayValue();
       var stuId = sheet.getRange('Y4');
       var grade = sheet.getRange('AH4').getDisplayValue();
       var fileName = (lastName+ ", " +firstName+ " - " +stuId+ " - Grade " +grade+ " - " +date);
       var destFolder = DriveApp.getFolderById('folderID'); 

       destFolder.setSharing(DriveApp.Access.DOMAIN_WITH_LINK, DriveApp.Permission.VIEW);

       DriveApp.getFileById(sheet.getId()).makeCopy(fileName, destFolder);

      }

最后,我的onOpen函数将这一切串起来(加上另一个函数),以便在模板打开后立即运行:

    function onOpen(){
       clearCells(); //Clear all content left behind by last editor
       BuildUI();
       makeCopy();
     }

非常感谢任何帮助实现此工作流程的帮助(我已经完成了大部分工作,我只是将其包含在内,以便您了解我的整体需求):

  1. 用户界面对话框,用于捕获学生ID(已完成,但可以使用建议进行清理)
  2. 将ID传递给单元格Y4,将当前日期传递给单元格C5(完成...仅包括在内以了解整体需求)
  3. 制作原始文件的副本,并将其重命名为"姓氏,名字 - StuID - 成绩 - 日期并存储在Google云端硬盘中的指定文件夹中(已完成...仅包括在内,以便了解整体需求)
  4. NEED - 在浏览器的新标签页中打开新创建的文件,而不运行附加的脚本(理想情况下,如果可能,脚本将不会包含在副本中)
  5. 奖励积分 ,以便在使用Google脚本中的HtmlService重新创建用户界面时提供任何帮助,因为不推荐使用UI服务,当我想出这一切时,功能可能会消失
  6. 提前感谢您提供有关此订单的任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用

捕获makeCopy()中的Google文件对象
gFile = DriveApp.getFileById(sheet.getId()).makeCopy(fileName, destFolder);
return gFile;

然后添加此功能以打开新工作表:

function openNewSheet(gFile) {
  var spreadsheetId = gFile.getId();
  var url = "https://docs.google.com/spreadsheets/d/"+spreadsheetId;
  //SpreadsheetApp.getUi().alert('url is ' + url);
  var html = "<script>window.open('" + url + "');google.script.host.close();</script>";
  var userInterface = HtmlService.createHtmlOutput(html);
   SpreadsheetApp.getUi().showModalDialog(userInterface, "Open Sheet");
  }

最后,您可以将openNewSheet()添加到onOpen()

的末尾

此视频有一些功劳:https://www.youtube.com/watch?v=2y7Y5hwmPc4