Обратный вызов по формуле скрипта Google не запускается - PullRequest
0 голосов
/ 10 марта 2020

Я не совсем уверен, что происходит в моем сценарии. Мой первый сценарий основан на событиях и перемещает данные с главной вкладки на вкладку CSV, которая по сути является промежуточной таблицей для 2-й и 3-й функции, которая создает файл .csv на моем диске Google. Обе функции onEdit(event) и saveAsCSV() работают сами по себе, но я действительно хочу вложить saveAsCSV() в мою функцию onEdit(event) так, чтобы csv. Файл сохраняется одновременно с созданием промежуточной таблицы. Любая идея, почему сценарий ниже не работает? Также я немного согласен со временем выполнения функций, так как мне нужно, чтобы часть onEdit(event) закончила sh, создавая промежуточную таблицу, прежде чем она создаст CSV. файл. Любая помощь будет принята с благодарностью. Спасибо!

function onEdit(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  var loopLengthNumber = r.getValues();
  for (var i=0; i < loopLengthNumber.length; i++) { 
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("CSV");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 2, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
  s.insertRowsAfter(s.getLastRow(), loopLengthNumber.length);
  saveAsCSV();
}

function saveAsCSV() {
    var daTime = Utilities.formatDate(new Date(), "GMT+1", "MM/dd/yyyy");
    var fileName = "Tasting7 Room "+ daTime;
    if (fileName.length !== 0) {
      fileName = fileName + ".csv";
      var csvFile = convertRangeToCsvFile_(fileName);
      DriveApp.createFile(fileName, csvFile, MimeType.CSV);
  }


  function convertRangeToCsvFile_(csvFileName) {
  // Get the selected range in the spreadsheet
  var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("CSV").getDataRange();
  try {
    var data = ws.getValues();
    var csvFile = undefined;

    // Loop through the data in the range and build a string with the CSV data
    if (data.length > 1) {
      var csv = "";
      for (var row = 0; row < data.length; row++) {
        for (var col = 0; col < data[row].length; col++) {
          if (data[row][col].toString().indexOf(",") != -1) {
            data[row][col] = "\"" + data[row][col] + "\"";
          }
        }

        // Join each row's columns
        // Add a carriage return to end of each row, except for the last one
        if (row < data.length-1) {
          csv += data[row].join(",") + "\r\n";
        }
        else {
          csv += data[row];
        }
      }
      csvFile = csv;
    }
    return csvFile;
  }
  catch(err) {
    Logger.log(err);
    Browser.msgBox(err);
  }
}
}

1 Ответ

0 голосов
/ 10 марта 2020

Как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Ответ на вопрос 1:

Любая идея, почему нижеприведенный скрипт не работает?

Если isnt working файл CSV не создан, я думаю, что в вашем скрипте необходимо использовать устанавливаемый триггер для использования метода createFile(). Поэтому, пожалуйста, переименуйте имя функции от onEdit до installedOnEdit в качестве образца и установите функцию как устанавливаемый триггер события OnEdit.

Ответ на вопрос 2:

Кроме того, я немного разбираюсь во времени выполнения функций, поскольку мне нужно, чтобы часть onEdit(event) закончила sh, создавая промежуточную таблицу, прежде чем она создаст CSV.

На текущем этапе скрипт Служб Google работает с синхронным процессом. Так что в вашем случае скрипт работает до запуска saveAsCSV().

Я думаю, что в вашей ситуации результат будет одинаковым как с использованием SpreadsheetApp.flush().

, так и без него. Ссылка:

Если я неправильно понял ваш вопрос и это не то направление, которое вам нужно, я приношу свои извинения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...