Google Sheets - Сценарий «Заменить» вместо «Создать», если имя файла совпадает - PullRequest
0 голосов
/ 19 января 2019

РЕДАКТИРОВАТЬ, чтобы попытаться сделать это проще для понимания:

Вот что я сделал:

Я создал таблицу Google. Я создал сценарий, который сохраняет его в папку на Google Диске, используя имя файла на основе даты обслуживания и имени клиента.

Это скрипт, который у меня сейчас есть:

// This creates a custom Menu Function so that I can save the file. 

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Choice Menu')
  .addItem('Submit Form','saveAsSpreadsheet')
       .addToUi();  }      

// Saves Spreadsheet in Google Drive Folder

function saveAsSpreadsheet() {
 var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var destFolder = DriveApp.getFolderById("0B8xnkPYxGFbUMktOWm14TVA3Yjg");
  DriveApp.getFileById(sheet.getId()).makeCopy(getFilename(), destFolder);
   } 

//This Function uses a cell "G4" (Which is Date and Customer Name) to create a file name. This file name will be then used for the above Script.

function getFilename() {

    var spreadsheet = SpreadsheetApp.getActive();

    var sheet = spreadsheet.getSheetByName('Manifest');
       var cell = sheet.getRange('G4');
    var filename = cell.getValue();

    return filename;}

Итак, мой код работает ОТЛИЧНО, за исключением одной проблемы.

Вот моя проблема:

Когда я во второй раз сохраняю электронную таблицу, используя вышеуказанный скрипт, она сохраняет новый файл. Я хочу сохранить его как новый файл, если имя файла не совпадает. Если имя файла совпадает, я хочу удалить исходный файл, а затем сохранить новый файл.

Что я пробовал: Из того, что я понимаю, читая комментарии ниже, мне нужно запустить код, который «1. должен будет выполнить запрос, чтобы увидеть, существуют ли какие-либо файлы с выбранным вами именем, и затем действовать соответствующим образом. 2. Если файлов с этим нет имя, затем создайте его (используя функцию, указанную выше). Если существует файл с таким же именем, 3. удалите исходный файл и создайте новый с тем же именем.

Я пытался в течение нескольких дней пробовать разные варианты, но ни один из них не работал, поэтому я надеюсь начать все сначала.

Цените любые решения или указания по кодированию, куда идти!

Ответы [ 2 ]

0 голосов
/ 23 января 2019
  • Ваш скрипт является связанным с контейнером скриптом Spreadsheet.
  • Когда электронная таблица с искомым именем файла существует в определенной папке, вы хотите заменить ее активной электронной таблицей.
    • На текущем этапе файл не может быть заменен, пока идентификатор файла не изменен. Таким образом, в этом измененном сценарии активная электронная таблица копируется, а искомый файл удаляется.
  • Если искомый файл не существует в определенной папке, вы хотите скопировать активную электронную таблицу в папку.
  • Вы хотите использовать значение, возвращаемое из getFilename() в качестве имени файла.

Если мое понимание верно, как насчет этой модификации? Я думаю, что есть несколько решений для вашей ситуации. Поэтому, пожалуйста, подумайте об этом, как об одном из них.

Модифицированный скрипт:

Пожалуйста, измените saveAsSpreadsheet() следующим образом.

function saveAsSpreadsheet() {
  var folderId = "0B8xnkPYxGFbUMktOWm14TVA3Yjg";
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFilesByName(getFilename());
  if (files.hasNext()) {
    files.next().setTrashed(true);
  }
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  DriveApp.getFileById(sheet.getId()).makeCopy(getFilename(), folder);
}

Примечание:

  • Для поиска файла я использовал getFilesByName(), потому что я думал, что имя файла кажется постоянным.
  • setTrashed() для удаления файла используется для этого скрипта. В этом случае файл помещается в корзину. Если вы хотите удалить файл напрямую, вы можете сделать это, используя Drive API . Тогда, пожалуйста, скажите мне.

Ссылки:

Edit:

Если вы хотите напрямую удалить файл, измените скрипт следующим образом.

От:

files.next().setTrashed(true);

Кому:

var params = {method: "delete", headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}};
UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + files.next().getId(), params);
  • Я использовал метод с использованием UrlFetchApp, потому что я думал, что в вашей ситуации Drive API уже включен. В этом случае вы можете использовать метод удаления Drive API, только заменив скрипт.

Справка:

0 голосов
/ 19 января 2019

Вам нужно сделать шаг назад и изменить свое представление об именах файлов.

В GDrive файлы идентифицируются по их уникальному идентификатору.name - это просто свойство метаданных вместе с timeModified, owner, mimeType и т. Д. Поэтому наличие нескольких файлов с одинаковым именем так же естественно, как наличие нескольких файлов с одним и тем же mimeType.

Ваш код должен будет выполнить запрос, чтобы увидеть, существуют ли какие-либо файлы с выбранным вами именем, и затем действовать соответствующим образом.Если нет файлов с таким именем, создайте их.Если есть, то у вас есть выбор обновить существующий файл или удалить исходный файл (ы) и создать новый с тем же именем.

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