编辑单元格时不会触发 Google Apps 脚本功能

问题描述 投票:0回答:1

我有一个功能,可以将图像上传到 Google Drive 并在 Google Sheets 单元格中创建其链接。这是代码片段:

function upload(obj) {
  var file = DriveApp.getFolderById("###").createFile(obj.upload);
  var activeSheet = SpreadsheetApp.getActiveSheet();
  var File_name = file.getName()
  var value = 'hyperlink("' + file.getUrl() + '";"' + File_name + '")'
  
  var activeSheet = SpreadsheetApp.getActiveSheet();
  activeSheet.getRange("B2").setFormula(value)
  
  return {
    fileId: file.getId(),
    mimeType: file.getMimeType(),
    fileName: file.getName(),
  };
}

function onChecked(e) {
 if (e.range.getA1Notation() === 'I1' && e.value === 'TRUE') {

  var html = HtmlService.createHtmlOutputFromFile('upload');
  SpreadsheetApp.getUi().showModalDialog(html, 'Upload File');
  }
}

我已经在

onChecked(e)
函数上设置了 onEdit 触发器,每当选中 cell I1 中的复选框时,都会触发此函数以在 Google Drive 中上传图像。它对我来说效果很好,但是当除我之外的任何其他用户选中此复选框时,它不会上传图像。这意味着
upload
功能未被任何其他用户执行。这是
upload.html
文件:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
  </head>
  <body>
  <form> <!-- Modified -->
    <div id="progress" ></div>
    <input type="file" name="upload" id="file">
    <input type="button" value="Submit" class="action" onclick="form_data(this.parentNode)" >
    <input type="button" value="Close" onclick="google.script.host.close()" />
  </form>
  <script>
    function form_data(obj){ // Modified
      google.script.run.withSuccessHandler(closeIt).upload(obj);
    };
    function closeIt(e){ // Modified
      console.log(e);
      google.script.host.close();
    };
  </script>
</body>
</html>

总结一下这个问题,这个函数对我来说工作得很好,但是当其他用户尝试运行它时,它只执行

onChecked
函数,但
upload()
函数不运行。任何在这方面的帮助将不胜感激。

html google-apps-script google-sheets google-drive-api
1个回答
0
投票

我相信您的目标如下。

  • 您希望用户使用您的显示脚本将文件上传到您的 Google 云端硬盘上的文件夹。
  • 在您的脚本中,函数
    onChecked
    已作为 OnEdit 触发器安装。

修改要点:

  • 根据您的情况,需要完成以下流程。
    1. 请与用户分享您的
      DriveApp.getFolderById("###")
      var file = DriveApp.getFolderById("###").createFile(obj.upload);
      文件夹。
    2. 请用户授权此脚本的范围。
    3. 在当前阶段,似乎在您的情况下,用户无法通过
      google.script.run
      解析表单对象。所以,需要在Javascript端解析表单对象。

当这些要点反映在你的脚本中时,就会变成如下所示。

1.共享文件夹

请与用户分享您的

DriveApp.getFolderById("###")
var file = DriveApp.getFolderById("###").createFile(obj.upload);
文件夹。

2.修改脚本

请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中。

Google Apps 脚本方面:

请设置您的文件夹ID。

function upload(obj) {
  var file = DriveApp.getFolderById("###").createFile(Utilities.newBlob(...obj));
  var activeSheet = SpreadsheetApp.getActiveSheet();
  var File_name = file.getName()
  var value = 'hyperlink("' + file.getUrl() + '";"' + File_name + '")'

  var activeSheet = SpreadsheetApp.getActiveSheet();
  activeSheet.getRange("B2").setFormula(value)

  return {
    fileId: file.getId(),
    mimeType: file.getMimeType(),
    fileName: file.getName(),
  };
}

function onChecked(e) {
  if (e.range.getA1Notation() === 'I1' && e.value === 'TRUE') {
    var html = HtmlService.createHtmlOutputFromFile('upload');
    SpreadsheetApp.getUi().showModalDialog(html, 'Upload File');
  }
}

// This is used to authorize the scopes of this script.
const test = _ => "ok";

HTML 和 JavaScript 方面:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
  </head>
  <body>
  <form> <!-- Modified -->
    <div id="progress" ></div>
    <input type="file" name="upload" id="file">
    <input type="button" value="Submit" class="action" onclick="form_data(this.parentNode)" >
    <input type="button" value="Close" onclick="google.script.host.close()" />
  </form>
  <script>
    function form_data(obj){
        const file = obj.upload.files[0];
        const fr = new FileReader();
        fr.onload = function(e) {
          const obj = [[...new Int8Array(e.target.result)], file.type, file.name];
          google.script.run.withSuccessHandler(closeIt).withFailureHandler(e => console.log(e.message)).upload(obj);
        };
        fr.readAsArrayBuffer(file);
    };
    function closeIt(e){
      google.script.host.close();
    };
  </script>
</body>
</html>

3.按用户授权范围

请由非电子表格所有者的用户运行上述 Google Apps 脚本中的函数

test()
。这样,用户就可以对该脚本的范围进行授权。这样就可以上传文件了。

4.测试

完成上述流程后,请选中“I1”复选框,并由非电子表格所有者的用户打开该对话框。并且,请上传文件。这样,文件就被放入

DriveApp.getFolderById("###")
文件夹中了。

© www.soinside.com 2019 - 2024. All rights reserved.