【问题标题】:Copy data from one sheet of Google Sheet to another with script and web-app使用脚本和网络应用程序将数据从一张 Google 表格复制到另一张表格
【发布时间】:2019-01-22 11:38:31
【问题描述】:

这是我的第一次脚本体验。我必须制作两种类型的电子表格。一个是给卖家的,另一个是给经理的。带有脚本按钮的卖方表中的数据正在导入到经理表中。我需要使用网络应用,因为卖家不应该看到经理的电子表格。

这是我损坏的代码。卖家脚本部分:

var spreadsheet = SpreadsheetApp.getActive();
var TEST = spreadsheet.getRange("B4").getValue();
var TWO = spreadsheet.getRange("B5").getValue();
var THREE = spreadsheet.getRange("B6").getValue();
var FOUR = spreadsheet.getRange("B7").getValue();
var FIVE = spreadsheet.getRange("B8").getValue(); 

function myFunction() {
  var data = "[new Date(), TEST, TWO, FIVE, FOUR, THREE ];"
  UrlFetchApp.fetch('https://script.google.com/a/***/exec', {payload: data}); 
};

和网络应用:

var SHEET_ID = '***';

function doPost(e){
  SpreadsheetApp.openById(SHEET_ID).getSheets()[0].appendRow(e.postData);
}

你能告诉我,它有什么问题吗?

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    恐怕代码有一些问题。以下示例可以正常工作。但它使用卖方(源)电子表格将数据推送到经理(目标)电子表格的模型,即发布的 Web 应用程序。

    您当然可以使用拉取模型来执行此操作,其中网络应用位于源电子表格中,而数据被拉取到目标电子表格中。哪个最好取决于诸如将有多少电子表格、它们多久更改一次以及您的整体安全模型等因素。


    Button handling code in the source / sending spreadsheet.

    function called_by_button(data_to_be_sent){
              // Make some test data.
              var data = {
                'date': new Date(),
                'first': 'data1',
                'second': 'data2'
              };
    
              var options = {
                'method' : 'post',
                'payload' : data,
                muteHttpExceptions: true
              };
              // This is probably the best way to use UrlFetchApp() and handle errors.
    
          var url = 'https://script.google.com/macros/s/your-url-here/exec';
    
          try {
            var response = UrlFetchApp.fetch(url, options); // Post the data (make the HTTP Request)
                var responseCode = response.getResponseCode();
                if (responseCode === 200) { // 200 = SUCCESS
                  Logger.log("url_fetch() response code %s ", responseCode);
                  return response; 
                } else {
                  Logger.log(Utilities.formatString("url_fetch() Request failed for: %s, Expected 200, got %d",url,responseCode ));
                  return false; 
                  // 
                }
              }// end Try
              catch (err) {
                 Logger.log(Utilities.formatString("url_fetch() Request failed (underlying network error). %s, response code: %s",err, responseCode));
                 return false;
              } 
       }
    

    doPost() published as a web app from the destination spreadsheet

    这会挑选出发送的值并在每一行中记录一个。请注意,由于目标应用程序已绑定到目标电子表格,因此无需使用openById() 查找和打开它。如果你把它做成一个独立的脚本,那么它就必须这样做。

    function doPost(e){
      var ss = SpreadsheetApp.getActive();
      var ws = ss.getActiveSheet();
      ws.appendRow([e.parameter.date]);
      ws.appendRow([e.parameter.first]);
      ws.appendRow([e.parameter.second]);
    }
    

    【讨论】:

    • 感谢您的回答!我按照你的建议做了并按下了按钮。目的地电子表格中未出现任何数据。没有令人震惊的消息。我感到不安。
    • @OpenReligion 发送方的日志查看器(查看菜单>>日志)中是否有任何内容?也许您应该在 doPost() 函数的开头添加ws.appendRow(["I was called"]); 以查看它是否被调用?
    • 来自日志:[19-01-22 22:57:13:861 MSK] url_fetch() 请求失败(基础网络错误)。 ReferenceError:未定义对象“url”。,响应代码:401
    • @OpenReligion 忽略未定义的 url,我已在上面的代码中修复了小故障。 401错误是授权问题。将应用程序重新发布为“任何人,甚至匿名”作为“谁有权访问应用程序:”问题的答案,这可能会解决它。但是访问this page 并探索authorizationpermissions 的主题。我怀疑“任何人,甚至是匿名的”是否适合您的应用程序的安全模型。
    • 非常感谢!现在电子表格之间的连接正常。但是数据让我抓狂。我需要从特定单元格中复制值并将其全部传递到一行中。当我尝试为数据复制设置特定单元格时,它在另一个电子表格上变为“未定义”。你能告诉我,如何使用 var TEST = spreadsheet.getRange("B8").getValue(); var data = "[new Date(), TEST ];"在您的代码中以及如何仅放入一行和两列。对不起,我觉得很丢脸。
    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多