- 您想要下载以下内容的 CSV 文件
players_20.csv
from https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset
并将 CSV 数据放入电子表格中。
- 您希望使用 Google Apps 脚本来实现此目的。
如果我的理解是正确的,这个答案怎么样?请将此视为多个答案之一。
问题和解决方法:
不幸的是,CSV数据不能直接从URL下载https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset#players_20.csv
。为了下载 CSV 文件,需要登录 kaggle。与其他模式一样,您也可以使用API下载它。在这个答案中,为了下载 CSV 文件,我使用了 Kaggle 的公共 API。
Usage:
1. 检索令牌文件:
在使用脚本之前,请先注册一个帐号https://www.kaggle.com
,并检索令牌文件。关于如何找回token文件,可以看官方文件 https://www.kaggle.com/docs/api#authentication.
为了使用 Kaggle 的公共 API,您必须首先使用 API 令牌进行身份验证。在网站标题中,单击您的用户个人资料图片,然后从下拉菜单中单击“我的帐户”。这将带您进入您的帐户设置:https://www.kaggle.com/account https://www.kaggle.com/account。向下滚动到页面中标记为 API 的部分:
要创建新令牌,请单击“创建新 API 令牌”按钮。这会将新的身份验证令牌下载到您的计算机上。
在此脚本中,使用下载的令牌文件中的令牌对象。
2.运行脚本:
请将以下脚本复制并粘贴到电子表格的容器绑定脚本中。并请设置变量csvFilename
, path
and tokenObject
。对于你的情况,我已经设置了csvFilename
and path
。因此,请仅设置您的令牌对象。
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.");
}
}
Flow:
该脚本的流程如下。
- 当脚本运行时,kaggle 命令为
kaggle datasets download -d stefanoleone992/fifa-20-complete-player-dataset
使用 Google Apps 脚本运行。这样,ZIP 文件就被下载了。
- 检索 CSV 文件
csvFilename
从下载的 ZIP 文件中。
- 从 CSV 文件中解析 CSV 数据。
- Put the CSV data to the active sheet.
- 在此脚本中,所有数据均使用 blob 进行处理。所以该文件没有创建。
Note:
- It seems that the CSV data is large. So please wait until the script is finished.
- 在我的环境中,我花了大约 150 秒的时间才将 CSV 数据放入电子表格中。
- 的 CSV 数据
players_20.csv
有 18279 行和 104 列。
- 如果错误发生在
Utilities.unzip(blob)
,请测试修改自var blob = UrlFetchApp.fetch(url, params).getBlob()
to var blob = UrlFetchApp.fetch(url, params).getBlob().setContentTypeFromExtension()
.
参考:
- Kaggle 公共 API 的身份验证 https://www.kaggle.com/docs/api#authentication
- Kaggle API https://github.com/Kaggle/kaggle-api
如果我误解了你的问题并且这不是你想要的方向,我深表歉意。
Added 1:
如果您想选择要放置的列,请按如下方式修改上面的示例脚本。
From:
var csvData = Utilities.parseCsv(csvBlob[0].getDataAsString());
var sheet = SpreadsheetApp.getActiveSheet();
To:
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列放入电子表格中。
Added 2:
From 将 CSV 数据放入电子表格的基准测试结果 https://gist.github.com/tanaikech/030203c695b308606041587e6da269e7例如,使用 Sheets API 来放置 CSV 数据怎么样?为此,请将上面的示例脚本修改如下。在运行脚本之前,请在高级 Google 服务中启用 Sheets API。 https://developers.google.com/apps-script/guides/services/advanced#enabling_advanced_services
From:
var csvData = Utilities.parseCsv(csvBlob[0].getDataAsString());
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
To:
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 数据放入电子表格中。
参考:
- 基准:使用 Google Apps 脚本将 CSV 数据导入电子表格 https://gist.github.com/tanaikech/030203c695b308606041587e6da269e7
- 高级谷歌服务 https://developers.google.com/apps-script/guides/services/advanced