从Google Drive中导入CSV文件数据到Google表格

9
我正在使用SAS每24小时生成两个CSV文件,并使用bat脚本将生成的CSV文件保存在Google Drive文件夹中。这些CSV文件由","分隔,仅包含三列或四列。
我想创建一个直接链接,将Google表格与CSV文件联系起来,以便Google表格可以自动更新到最新的数字。
我尝试使用"ImportData"函数,但没有成功。
=IMPORTDATA("https://drive.google.com/file/d/123231jshu231731/edit?usp=sharing")

其中123231jshu231731是文件ID。

但我收到的错误信息是

Result was not automatically expanded, please insert more columns (896).

这并没有意义,因为文件只有3列。
希望有人能提供更好的自动化解决方案。
谢谢。

你在不公开 .csv 文件的情况下成功了吗? - a-burge
4个回答

4

发布csv文件到网络

显然,IMPORTDATA 仅适用于发布到网络的文档。您可以采取以下两种方法使其对您有用:

  1. 将您的csv文件存储在公共 Google Drive 文件夹中
  2. 以其他方式将您的csv文件托管到网络上 - 我想您需要在计算机上运行一个带有csv文件的服务器。

但是,这将使您的csv数据公开给与互联网连接的任何人(可能不是您想要的)。


保持csv文件私密

如果您希望数据保持私密,您可以编写一个定期将csv数据加载到电子表格中的脚本。

Google 提供了一个名为 Google Apps Script (GAS) 的服务,它允许您使用 JavaScript 编写脚本,在 Google Drive 中执行更复杂的任务。

在 GAS 中,您可以创建称为 可安装触发器 的东西,您可以设置它以在一定时间间隔内定期运行。

以下是我编写上传csv数据脚本的基本布局:

function timedTrigger() {
  // list the csv file ids
  var baseballScoresFileId = "123231jshu231731";
  var donutPricesFileId = "984732ageyn555646";

  // get the spreadsheet by it's id
  var ss = SpreadsheetApp.openById("the spreadsheet id");

  // get the sheets you want to print the data to
  var baseballSheet = ss.getSheetByName("Baseball Scores");
  var donutsSheet = ss.getSheetByName("Donuts Scores");

  // print the data to the first row first columnscript
  printCsvData(baseballScoresFileId, baseballSheet, 1, 1);

  printCsvData(donutPricesFileId, donutsSheet, 5, 2); // prints to B5
}

// This function loads the data from a csv fileId
//   and prints it to the sheet starting at the cell
//   located at (row, col)
// It works just like IMPORTDATA except you specify the row and col in the 
function printCsvData(fileId, sheet, row, col) {
  // get data from file
  var data = DriveApp.getFileById(fileId).getBlob().getDataAsString();

  // parse the csv string into two dimensional array
  var values = parseCsvData(data);

  // print the values into the range starting at row, col
  sheet.getRange(row, col, values.length, values[0].length).setValues(values);
}

// This function converts a string of comma
//   separated values and converts them into
//   a two dimensional array
function parseCsv(string) {
  var values = [];
  // ...
  return values;
}

我不太确定你的CSV文件格式是怎样的,但我最好的猜测是:

function parseCSV(string) {
  return string.split("\n").map(function (row) {
    return row.split(",");
  });
}

您可能需要担心多余的空格。


如果您不熟悉JavaScript或编程,这将是一个很好的学习机会。但是,如果加载csv文件不是迫切需要,请注意学习如何设置脚本可能需要5-20个小时。无论哪种方式,祝您好运!


1
很好的答案,但令人失望的是.csv必须是公开的。这在许多情况下有效地使Google Drive作为云存储无用。我试图解决与@KhalidN相同的问题,但对于一个太大而无法完全打开的.csv文件。希望使用importdata()访问其中的子集。 - a-burge
使用 'Utilities.parseCsv()' 而不是自己编写解析器。 - robartsd

4

我很喜欢在数字灵感上找到的谷歌应用脚本解决方案。

function importCSVFromGoogleDrive() {
  var file = DriveApp.getFilesByName("filename").next();
  var csvData = Utilities.parseCsv(file.getBlob().getDataAsString());
  var sheet = SpreadsheetApp.getActive().getSheetByName("sheetname")
  sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
}

这与电子表格函数IMPORTDATA()不同,它将覆盖已经存在于您的电子表格中的数据。第一次运行函数时,您需要授权它读取您的Drive文件并修改您的电子表格。授权后,您可以添加触发器使其在每次打开电子表格进行编辑时运行。


我喜欢它作为一个更短、更简洁的解决方案。加上触发器,它可以很好地工作。 - delimiter

2
要从Google Drive上的一个.csv文件中导入数据,该文件每小时自动更新一次,您应该在单元格中使用以下函数。
=IMPORTDATA("https://drive.google.com/uc?export=download&id=KEY_DRIVE_FILE")

Google 表格现在每小时将从此文件获取数据(您无法更改此设置。它只会每小时查找一次此文件)。

URL 中的 'export=download' 选项可以完成任务。您将在您的电子表格中获得与您的 .CSV 文件完全相同的副本。

您的 Google Drive 文件的密钥可以在 URL 中找到。

KEY_DRIVE_FILE(您的 Google Drive 文件的密钥)可以在 URL 中找到,通常在 enter image description here 部分之后。

在这个图片中是使用电子表格,但是对于任何文件都是如此。文件应该放在 drive 的公共文件夹中。


我的 CSV 文件有 3 行,“错误:结果没有自动扩展,请插入更多行 (21858)”。 - stallingOne
它能工作!!!无法说出你是如何找到它的,为什么它需要这个“绕路”,以及为什么它不稳定,但它似乎在其他任何东西都不起作用时(即使从脚本编辑器中运行良好的函数,在从电子表格调用时需要“额外权限”...)时有时能够工作。谢谢。 - Apostolos55

0

KEY_DRIVE_FILE 可以通过共享 Drive 功能获取链接(实际上不需要共享)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接