【问题标题】:Google Apps Script to Open copy of Google Sheet in new window用于在新窗口中打开 Google 表格副本的 Google Apps 脚本
【发布时间】:2017-11-14 12:50:52
【问题描述】:

我正在尝试通过编写脚本来增加我的 Google 知识,并且我研究了高低以找到解决我的情况的方法,但无济于事。

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

到目前为止,我可以让对话框弹出 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. 需要 -- 在浏览器的新选项卡中打开新创建的文件,而不运行附加的脚本(理想情况下,如果可能,脚本不会包含在副本中)
  5. 奖励积分在 Google 脚本中使用 HtmlService 重新创建 UI 的任何帮助,因为 UI 服务已被弃用,并且功能可能会在我弄清楚这一切的那一刻消失。李>

在此先感谢您对这项艰巨任务的任何帮助。

【问题讨论】:

  • ui 服务不会消失。您不能自动打开新的电子表格,而是必须创建一个锚点并要求用户单击它。至于其他问题,请关注每个帖子的一个问题。
  • @Adam 的问题中引用的 UiApp 已弃用。

标签: javascript html google-apps-script


【解决方案1】:

您可以使用

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");
  }

最后你可以在onOpen()的末尾添加openNewSheet()

感谢这个视频:https://www.youtube.com/watch?v=2y7Y5hwmPc4

【讨论】:

  • 有时当我运行代码时它可以工作并打开一个新选项卡,而其他时候什么也没有发生,为什么会这样?
  • 这仍然应该在 2021 年工作吗?我可以记录 html,但 userInterface 记录为 {} 并且没有显示任何内容。是否有高级功能、库、身份验证、其他秘密?我尝试了电子表格和驱动器 URL 格式。
猜你喜欢
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 2017-04-16
  • 2014-05-18
  • 1970-01-01
相关资源
最近更新 更多