首页 > 解决方案 > 如何从 JS 或 node.js 发布?

问题描述

我想POST从我的 JS 或 node.js 文件中执行以下命令。

终端.zsh
curl -L --data-binary @data/scrape.csv https://script.google.com/macros/s/#/exec

我可以使用以下代码从我的 node.js 文件成功写入我的 .csv 文件。

节点.js
const ObjectsToCsv = require('objects-to-csv');
const itemsAsCsv = new ObjectsToCsv(formattedItems);
itemsAsCsv.toDisk(filePathCsv, { allColumns: true, });

我没有成功尝试以下。我希望看到数据命中我的 API,但我没有看到任何数据。

节点.js
const request = require('request');
request({
  method: 'POST',
  preambleCRLF: true,
  postambleCRLF: true,
  uri: postUrl,
  multipart: {
    chunked: false,
    data,
  },
},

我究竟做错了什么?

标签: javascriptnode.jsgoogle-apps-scripthttprequest

解决方案


  • 您想使用 Node.js 将 CSV 文件上传到 Google Apps Script 的 Web Apps。
    • 从 的 URL 中https://script.google.com/macros/s/#/exec,我可以了解到您正在使用 Google Apps Script 的 Web Apps。

如果我的理解是正确的,这个答案怎么样?请认为这只是几个可能的答案之一。

问题和解决方法:

遗憾的是,在现阶段,在 Google Apps Script 的 Web Apps 中,即使在使用multipart/form-datamultipart/related使用时,也无法解析接收到的数据。因此,在这种情况下,作为一种解决方法,CSV 数据作为数据发送。

修改后的脚本:

当你的 Node.js 脚本被修改时,下面的修改怎么样?在使用此脚本之前,请设置 Web Apps 的 URL 和文件的文件名。

const fs = require("fs");
const request = require("request");
request(
  {
    url: "https://script.google.com/macros/s/###/exec", // Please set this.
    method: "POST",
    body: fs.createReadStream("./sample.csv"), // Please set this.
    followAllRedirects: true
  },
  function(err, res, body) {
    if (err) {
      console.log(err);
      return;
    }
    // console.log(res);
    console.log(body);
  }
);
  • 在这个修改后的脚本中,它假设 CSV 文件作为样本上传。示例 CSV 文件名是sample.csv.
  • 运行此脚本时,CSV 文件将上传到 Web 应用程序。
  • followAllRedirects是重定向。默认值为false。如此true设置。这是访问 Google Apps 脚本的 Web 应用程序所必需的。
  • 如果要上传对象之类的data = { key1: "value1", key2: "value2" },请修改body: fs.createReadStream("./sample.csv"),body: JSON.stringify(data),. 这样,可以使用JSON.parse(e.postData.contents)at检索和解析该值doPost(e)

Web 应用程序的示例脚本:

function doPost(e) {
  var csv = Utilities.parseCsv(e.postData.contents);

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  sheet.appendRow([JSON.stringify(e)]);
  sheet.getRange(sheet.getLastRow() + 1, 1, csv.length, csv[0].length).setValues(csv);

  return ContentService.createTextOutput("ok");
}
  • 通过上面的脚本,当示例 Node.js 脚本运行时,sample.csv被上传,上传的数据被解析为Utilities.parseCsv(). 然后,将解析的值放入Sheet1活动电子表格的工作表中。
  • 如果分隔符不是,,请设置为parseCsv(csv, delimiter).

样品情况:

当使用上述 Node.js 脚本将以下 CSV 文件 ( sample.csv) 上传到上述 Web 应用程序时,

a1,b1,c1,d1,e1
a2,b2,c2,d2,e2
a3,b3,c3,d3,e3
a4,b4,c4,d4,e4
a5,b5,c5,d5,e5
a6,b6,c6,d6,e6
a7,b7,c7,d7,e7
a8,b8,c8,d8,e8
a9,b9,c9,d9,e9
a10,b10,c10,d10,e10

可以检索以下事件对象。因此 CSV 数据可以通过Utilities.parseCsv(e.postData.contents).

{
  "parameter": {},
  "contextPath": "",
  "contentLength": 165,
  "queryString": "",
  "parameters": {},
  "postData": {
    "type": "text/csv",
    "length": 165,
    "contents": "a1,b1,c1,d1,e1\r\na2,b2,c2,d2,e2\r\na3,b3,c3,d3,e3\r\na4,b4,c4,d4,e4\r\na5,b5,c5,d5,e5\r\na6,b6,c6,d6,e6\r\na7,b7,c7,d7,e7\r\na8,b8,c8,d8,e8\r\na9,b9,c9,d9,e9\r\na10,b10,c10,d10,e10\r\n",
    "name": "postData"
  }
}

笔记:

  • 当您修改 Web Apps 的脚本时,请重新部署 Web Apps。这样,最新的脚本就会反映到 Web 应用程序中。

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。


推荐阅读