将 CSV 数据导入 Google 表格

Import CSV data into Google Sheets

尝试对此文件使用 IMPORTDATA 函数时:

https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset#players_20.csv

出现意外错误,提示无法将数据导入电子表格。有没有其他方法可以将这些数据添加到我的电子表格中?

这些数据对我正在做的工作非常重要。能够键入和复制所有内容,然后根据我的需要进行过滤,这将使我节省将近 3 个月的工作时间。

能够至少导入所有玩家的简单信息非常重要,但不一定必须导入每个玩家的所有信息列。可以导入的列数已经很完美了

如有办法,将不胜感激

  • 您想从 https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset 下载 players_20.csv 的 CSV 文件并将 CSV 数据放入 Spreadsheet。
  • 您想使用 Google Apps 脚本实现此目的。

如果我的理解是正确的,这个答案怎么样?请将此视为几个答案之一。

问题和解决方法:

很遗憾,无法直接从https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset#players_20.csv 的URL 下载CSV 数据。为了下载 CSV 文件,需要登录到 kaggle。和其他花样一样,您也可以使用API下载它。在这个答案中,为了下载 CSV 文件,我使用了 Kaggle 的 public API.

用法:

1。检索令牌文件:

在使用脚本之前,请先注册一个账号到https://www.kaggle.com,并获取token文件。关于如何取回token文件,可以看the official document.

In order to use the Kaggle’s public API, you must first authenticate using an API token. From the site header, click on your user profile picture, then on “My Account” from the dropdown menu. This will take you to your account settings at https://www.kaggle.com/account. Scroll down to the section of the page labelled API:

To create a new token, click on the “Create New API Token” button. This will download a fresh authentication token onto your machine.

在此脚本中,使用了下载的令牌文件中的令牌对象。

2。 运行 脚本:

请将以下脚本复制粘贴到Spreadsheet的容器绑定脚本中。并且请设置csvFilenamepathtokenObject的变量。在你的情况下,我已经设置了 csvFilenamepath。所以请只设置你的令牌对象。

function myFunction() {
  var csvFilename = "players_20.csv"; // Please set the CSV filename.
  var path = "stefanoleone992/fifa-20-complete-player-dataset"; // Please set the path.
  var tokenObject = {"username":"###","key":"###"}; // <--- Please set the token object.
  
  var baseUrl = "https://www.kaggle.com/api/v1/datasets/download/";
  var url = baseUrl + path;
  var params = {headers: {Authorization: "Basic " + Utilities.base64Encode(tokenObject.username + ':' + tokenObject.key)}};
  var blob = UrlFetchApp.fetch(url, params).getBlob();
  var csvBlob = Utilities.unzip(blob).filter(function(b) {return b.getName() == csvFilename});
  if (csvBlob.length == 1) {
    var csvData = Utilities.parseCsv(csvBlob[0].getDataAsString());
    var sheet = SpreadsheetApp.getActiveSheet();
    sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
  } else {
    throw new Error("CSV file of " + csvFilename + " was not found.");
  }
}
流动:

这个脚本的流程如下。

  1. 脚本为运行时,kaggle datasets download -d stefanoleone992/fifa-20-complete-player-dataset的kaggle命令为运行 with Google Apps Script。这样,ZIP文件就下载好了。
  2. 从下载的 ZIP 文件中检索 csvFilename 的 CSV 文件。
  3. 解析 CSV 文件中的 CSV 数据。
  4. 将CSV数据放入活动sheet。
    • 在此脚本中,所有数据均使用 blob 进行处理。所以文件没有创建。

注:

  • CSV 数据似乎很大。所以请等到脚本完成。
    • 在我的环境中,我花了大约 150 秒才将 CSV 数据放入 Spreadsheet。
    • players_20.csv的CSV数据有18279行104列。
  • 如果Utilities.unzip(blob)出现错误,请测试从var blob = UrlFetchApp.fetch(url, params).getBlob()修改为var blob = UrlFetchApp.fetch(url, params).getBlob().setContentTypeFromExtension()

参考文献:

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

添加了 1 个:

如果你想select你想放的列,请修改上面的示例脚本如下。

发件人:

var csvData = Utilities.parseCsv(csvBlob[0].getDataAsString());
var sheet = SpreadsheetApp.getActiveSheet();

收件人:

var csvData = Utilities.parseCsv(csvBlob[0].getDataAsString());
var needColumns = [1, 2, 3];
csvData = csvData.map(function(row) {return needColumns.map(function(col) {return row[col]})});
var sheet = SpreadsheetApp.getActiveSheet();
  • 上述修改中,作为测试用例,将1、2、3列放入Spreadsheet。

添加了 2 个:

来自the result of benchmark for putting CSV data to Spreadsheet, for example, how about using Sheets API for putting CSV data? For this, please modify above sample script as follows. Before you run the script, please enable Sheets API at Advanced Google services.

发件人:

var csvData = Utilities.parseCsv(csvBlob[0].getDataAsString());
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);

收件人:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var resource = {requests: [{pasteData: {data: csvBlob[0].getDataAsString(), coordinate: {sheetId: sheet.getSheetId()}, delimiter: ","}}]};
Sheets.Spreadsheets.batchUpdate(resource, ss.getId());
  • 在这种情况下,我花了大约 50 秒才将 CSV 数据放入 Spreadsheet。

参考: