- 您想从
https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset 下载players_20.csv 的CSV 文件并将CSV 数据放到电子表格中。
- 您希望使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,那么这个答案呢?请认为这只是几个答案之一。
问题和解决方法:
很遗憾,无法从https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset#players_20.csv 的 URL 直接下载 CSV 数据。要下载 CSV 文件,需要登录 kaggle。与其他模式一样,您也可以使用 API 下载它。在这个答案中,为了下载 CSV 文件,我使用了 Kaggle 的公共 API。
用法:
1。检索令牌文件:
在使用脚本之前,请先注册一个https://www.kaggle.com的账号,并获取token文件。关于如何获取token文件,可以看the official document。
为了使用 Kaggle 的公共 API,您必须首先使用 API 令牌进行身份验证。在站点标题中,单击您的用户个人资料图片,然后从下拉菜单中单击“我的帐户”。这会将您带到https://www.kaggle.com/account 的帐户设置。向下滚动到标有 API 的页面部分:
要创建新令牌,请单击“创建新 API 令牌”按钮。这会将新的身份验证令牌下载到您的计算机上。
在此脚本中,使用了下载的令牌文件中的令牌对象。
2。运行脚本:
请将以下脚本复制并粘贴到电子表格的容器绑定脚本中。请设置csvFilename、path和tokenObject的变量。在你的情况下,我已经设置了csvFilename 和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.");
}
}
流动:
这个脚本的流程如下。
- 当脚本运行时,
kaggle datasets download -d stefanoleone992/fifa-20-complete-player-dataset 的 kaggle 命令与 Google Apps 脚本一起运行。这样,ZIP 文件就被下载了。
- 从下载的 ZIP 文件中检索
csvFilename 的 CSV 文件。
- 从 CSV 文件解析 CSV 数据。
- 将 CSV 数据放入活动工作表。
- 在此脚本中,所有数据都使用 blob 进行处理。所以文件没有被创建。
注意:
- CSV 数据似乎很大。所以请等到脚本完成。
- 在我的环境中,我花了大约 150 秒的时间将 CSV 数据放入电子表格。
-
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:
如果要选择要放置的列,请将上面的示例脚本修改如下。
发件人:
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 列放入电子表格。
新增2:
例如来自the result of benchmark for putting CSV data to Spreadsheet,使用Sheets API 来放置CSV 数据怎么样?为此,请按如下方式修改上述示例脚本。在运行脚本之前,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 数据放入电子表格。
参考: