【问题标题】:Create a Google document from a script bound to a Google spreadsheet从绑定到 Google 电子表格的脚本创建 Google 文档
【发布时间】:2015-08-08 14:36:56
【问题描述】:

我正在尝试根据存储在 Google 电子表格中的数据创建文档。我在绑定脚本(电子表格)中创建了一个函数,当触发该函数时,应该获取适当的数据并将其放入新文档中。但是,我在尝试时遇到权限错误。

您能否从绑定到电子表格的脚本创建一个 google 文档(在您的 google 驱动器中)?如果是这样,怎么做?

以下是复制行为的一些步骤:

来自基本的谷歌表格:

 |     A      |     B     |   C   |    D     |
1| First Name | Last Name | Ready | Function |
2| John       | Doe       |       |          |
3| Jane       | Doe       |       |          |

我使用脚本编辑器创建了以下函数:

function createDocument(ready, row) {
  if(ready) {
    var data = Utilities.formatString("Hello %s %s", row[0][0], row[0][1]);
    var doc = DocumentApp.create("Testing");
    var body = doc.getBody();
    body.appendParagraph(data);
    return "Success"
  }
}

D2 有以下调用:

 =createDocument(C2, A2:B2)

但是当我在 C2 中输入“TRUE”(触发创建文档)时,我收到以下错误:

Error you do not have permission to call create (line 4).

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    您可以通过在脚本中使用触发器来解决此问题。

    您可以使用onOpen(菜单)或onEdit,它们各有优势。你也可以同时使用:)

    onEdit:对一行立即执行操作。 (一次一行)

    onOpen:根据请求通过菜单对多行同时执行操作。

    function onOpen() {
      var ui = SpreadsheetApp.getUi();
      ui.createMenu("Your Menu")
        .addItem("Process names", "spreadsheetToDoc")
        .addToUi();
    }
    
    function spreadsheetToDoc() {
      var range = SpreadsheetApp.getActiveSheet().getDataRange();
      var values = range.getValues();
      var reg = /^true$/i;
      for(var i = 0; i < values.length; i++) {
        if(reg.test(values[i][2])) {
          createDocument(values[i]);
          range.getCell(i+1,4).setValue("Success");
          range.getCell(i+1,3).setValue("");
        }
      }
    }
    
    function createDocument(row) {
        var data = Utilities.formatString("Hello %s %s", row[0], row[1]);
        var doc = DocumentApp.create("Testing");
        var body = doc.getBody();
        body.appendParagraph(data);
    }
    

    onEdit 触发器检查活动行中 C 列的值是否已更改。

    function onEdit() {
      var sheet = SpreadsheetApp.getActiveSheet();
      var range = sheet.getDataRange();
      var values = range.getValues();
      var reg = /^true$/i;
      var i = sheet.getActiveCell().getRow() - 1;
    
      if(reg.test(values[i][2])) {
        createDocument(values[i]);
        range.getCell(i+1,3).setValue("");
        range.getCell(i+1,4).setValue("Success");
      }
    }
    
    function createDocument(row) {
        var data = Utilities.formatString("Hello %s %s", row[0], row[1]);
        var doc = DocumentApp.create("Testing");
        var body = doc.getBody();
        body.appendParagraph(data);
    }
    

    您必须手动添加触发器(通过菜单转到项目触发器)。

    祝你好运!

    【讨论】:

      【解决方案2】:

      您创建的自定义函数只会返回一个值到它们所在的单元格和相邻的单元格,如果它们返回一个数组,仅此而已。

      要执行您的脚本,您需要使用其他方法来触发它,例如自定义菜单或 onEdit 触发器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-25
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多