Уменьшите время выполнения/выполнение функции импорта для таблиц Google и скрипта GoogleApps

#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» соответственно.

Рекомендации: