Anda ingin mengonversi file CSV besar ke Spreadsheet terpisah. Jika pemahaman saya benar, bagaimana dengan solusi ini?
Masalah dan solusi untuk situasi ini:
Ketika file CSV sebesar itu dikonversi ke Spreadsheet, file tersebut tidak dapat langsung dikonversi ke Spreadsheet, karena jumlah total sel dan ukuran file. Dan juga ketika file berukuran besar dicoba untuk dipecah, tidak dapat dilakukan karena blob yang dapat digunakan di GAS kurang dari 50 MB (52.428.800 bytes).
Di lingkungan saya, ketika file CSV berukuran 100 MB digunakan untuk contoh skrip ini, ketika file dibagi menjadi 10 MB, diperlukan waktu sekitar 65 detik untuk mengonversi potongan menjadi Spreadsheet. Dalam hal ini, ketika file CSV dikonversi sepenuhnya, dianggap sudah melebihi batas waktu (6 menit) untuk mengeksekusi GAS.
- In order to avoid this, it is required to implement the resumable conversion from the large CSV-file to several spreadsheets.
Mempersiapkan :
Untuk menggunakan contoh skrip ini, aktifkan Drive API di Layanan Google Lanjutan dan konsol API.
Aktifkan Drive API v2 di Layanan Google Tingkat Lanjut
- On script editor
- Resources -> Advanced Google Services
- Aktifkan Drive API v2
- On script editor
- Resources -> Cloud Platform project
- Lihat konsol API
- Di Memulai, klik Aktifkan API dan dapatkan kredensial seperti kunci.
- Di sisi kiri, klik Perpustakaan.
- Di Penelusuran API & layanan, masukkan "Drive". Dan klik Drive API.
- Klik tombol Aktifkan.
- Jika API sudah diaktifkan, mohon jangan dimatikan.
Contoh skrip:
function createSplitSpreadsheet(obj) {
var accessToken = ScriptApp.getOAuthToken();
var baseUrl = "https://www.googleapis.com/drive/v3/files/";
// Retrieve file size.
var url1 = baseUrl + obj.fileId + "?fields=size";
var params1 = {
method: "get",
headers: {Authorization: "Bearer " + accessToken},
};
var fileSize = Number(JSON.parse(UrlFetchApp.fetch(url1, {headers: {Authorization: "Bearer " + accessToken}}).getContentText()).size);
// Calculate number of output files.
if (obj.files == null) {
obj.number = 1;
obj.start = 0;
}
var start = obj.start;
var end = start + obj.chunk;
var useFileSize = fileSize - start;
f = Math.floor(useFileSize / obj.chunk);
f = useFileSize % obj.chunk > 0 ? f + 1 : f;
if (f < obj.files || obj.files == null) {
obj.files = f;
}
// Split large file by chunk size (bytes).
var url2 = baseUrl + obj.fileId + "?alt=media";
var i;
for (i = 0; i < obj.files; i++) {
var params = {
method: "get",
headers: {
Authorization: "Bearer " + accessToken,
Range: "bytes=" + start + "-" + end,
},
};
var res = UrlFetchApp.fetch(url2, params).getContentText();
var e = res.lastIndexOf("\n");
start += e + 1;
end = start + obj.chunk;
Drive.Files.insert(
{mimeType: MimeType.GOOGLE_SHEETS, title: obj.fileName + (i + obj.number)},
Utilities.newBlob(res.substr(0, e), MimeType.CSV)
);
}
// Return next start value if there is a next chunk for the resume.
if (start < fileSize) {
return {nextStart: start, nextNumber: i + obj.number};
} else {
return null;
}
}
// Please run this function.
function main() {
var obj = {
fileId: "#####", // File ID of the large CSV file.
chunk: 10485760, // 10MB Please modify this for your situation.
files: 3, // Please input the number of files you want to convert.
start: 0,
fileName: "sample",
number: 1, // Counter of output files. Please input this as a next number.
};
var nextStart = createSplitSpreadsheet(obj);
Logger.log(nextStart);
}
Penggunaan :
Saat Anda menggunakan ini, harap ubah obj
di main()
sesuai situasi Anda, dan jalankan main()
. Contoh kasusnya adalah sebagai berikut.
Diperkirakan sebagai berikut.
- Anda ingin mengonversi file CSV berukuran 100 MB menjadi 10 spreadsheet.
- Ukuran satu potongan adalah 10 MB.
- File CSV diproses setiap 3.
Dalam contoh kasus ini, setiap obj
adalah sebagai berikut. Silakan masukkan setiap obj
pada setiap proses.
var obj = {fileId: "#####", chunk: 10485760, files: 3, start: 0, fileName: "sample", number: 1}
{"nextStart": ### nextStart2 ###, "nextNumber": 4}
is returned from createSplitSpreadsheet()
.
var obj = {fileId: "#####", chunk: 10485760, files: 3, start: ### nextStart2 ###, fileName: "sample", number: 4}
{"nextStart": ### nextStart3 ###, "nextNumber": 7}
is returned from createSplitSpreadsheet()
.
var obj = {fileId: "#####", chunk: 10485760, files: 3, start: ### nextStart3 ###, fileName: "sample", number: 7}
{"nextStart": ### nextStart4 ###, "nextNumber": 10}
is returned from createSplitSpreadsheet()
.
var obj = {fileId: "#####", chunk: 10485760, files: 3, start: ### nextStart4 ###, fileName: "sample", number: 10}
null
is returned from createSplitSpreadsheet()
.
Dengan alur ini, 10 spreadsheet dibuat dari file CSV berukuran 100 MB.
Jika null
digunakan untuk files
di obj
, files
dihitung secara otomatis. Namun dalam kasus ini, batasan waktu pelaksanaan GAS mungkin telah berakhir. Harap berhati-hati dalam hal ini.
Referensi :
Jika ini bukan yang Anda inginkan, saya minta maaf.
person
Tanaike
schedule
26.06.2018