#google-apps-script #google-sheets
Вопрос:
В настоящее время есть скрипт, который извлекает CSV-файлы с Google диска из ссылки на ячейку. Просто интересно, есть ли способ сократить время выполнения. В настоящее время запуск скрипта занимает около 45-60 секунд. Буду признателен за любую помощь или полностью альтернативный способ получить более быстрый ответ, например, когда я меняю ссылки на ячейки, мои данные извлекаются быстрее.
function importCSV() {
const ss = SpreadsheetApp.getActive();
const id = ss.getSheetByName("Dashboard").getRange("A2").getValue();
const folder = DriveApp.getFolderById(id);
const name = ss.getSheetByName("Dashboard").getRange("B2").getValue();
const name2 = ss.getSheetByName("Dashboard").getRange("C2").getValue();
const file = folder.getFilesByName(name).next();
const file2 = folder.getFilesByName(name2).next();
const csvData = Utilities.parseCsv(file.getBlob().getDataAsString());
const csvData2 = Utilities.parseCsv(file2.getBlob().getDataAsString());
const target = ss.getSheetByName("Input");
const target2 = ss.getSheetByName("Input2");
target.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
target2.getRange(1, 1, csvData2.length, csvData2[0].length).setValues(csvData2);
}
Ответ №1:
Я считаю, что ваша цель заключается в следующем.
- Вы хотите снизить стоимость процесса вашего сценария.
Точки изменения:
id
,name
иname2
может быть извлечен одним вызовом.- Чтобы поместить данные CSV путем анализа строковых данных в электронную таблицу, при использовании API листов стоимость процесса может быть снижена. Ссылка, а также несколько данных CSV могут быть помещены на каждый лист одним вызовом API.
Когда вышеуказанные пункты будут отражены в вашем сценарии, он будет выглядеть следующим образом.
Измененный сценарий:
Прежде чем использовать этот скрипт, пожалуйста, включите API листов в расширенных службах Google.
function importCSV() {
const ss = SpreadsheetApp.getActive();
const dstSheets = ["Input", "Input2"];
const [id, ...filenames] = ss.getSheetByName("Dashboard").getRange("A2:C2").getValues()[0];
const folder = DriveApp.getFolderById(id);
const obj = filenames.map((f, i) => ({dst: ss.getSheetByName(dstSheets[i]).getSheetId(), data: folder.getFilesByName(f).next().getBlob().getDataAsString()}));
var resource = {requests: obj.map(({dst, data}) => ({pasteData: {data: data, coordinate: { sheetId: dst }, delimiter: ","}}))};
Sheets.Spreadsheets.batchUpdate(resource, ss.getId());
}
- В этом скрипте 2 CSV-данные имен файлов, извлеченных из ячеек «B2» и «C2», помещаются на лист «Ввод» и «Ввод2» соответственно.