Переместить таблицу с «Моего диска» на общий диск

У меня есть сценарий, который создает новую электронную таблицу и копирует две вкладки с текущего листа на новый. Я бы предпочел, чтобы новый лист сохранялся в папке общего диска, а не в папке «Мой диск». Ниже приведена текущая итерация, над которой я работаю. Закомментированные строки - это те, которые не работают.

function SaveNewFinancials() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Inputs'), true);  
  var filename = spreadsheet.getRange("B15").getValue();
  var newSpreadsheet = SpreadsheetApp.create(filename);
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Balance Sheet'), true);  
  SpreadsheetApp.getActiveSheet().copyTo(newSpreadsheet).setName("Balance Sheet");
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Profit and Loss'), true);
  SpreadsheetApp.getActiveSheet().copyTo(newSpreadsheet).setName("Profit and Loss");
  newSpreadsheet.deleteSheet(newSpreadsheet.getSheetByName("Sheet1"));
  //var folderID = "xxxxxxx3nTzzyS-I1pWzsejHDCh5";
  //var sharedFolder = DriveApp.getFolderById(folderID);
  //var sharedDriveID = "xxxxxxxxenHXUk9PVA";
  //var resource = {title: filename, mimeType: MimeType.GOOGLE_SHEETS, parents: [{driveid: sharedDriveID, id: sharedFolder}]};
  //Drive.Files.copy(resource, newSpreadsheet,{supportsAllDrives: true});

Я включил расширенную службу диска, но по-прежнему получаю ошибки при попытке найти папку на общем диске.

Я пробовал использовать moveTo и copyTo, но узнал, что DriveApp не очень хорошо работает с общими дисками. Я также не думаю, что мне нужен идентификатор диска, но я видел его в нескольких других ответах здесь, поэтому добавил его в своей последней попытке. Заранее благодарю за любую помощь!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

попробуйте вот так:

function SaveNewFinancials() {
  var spreadsheet = SpreadsheetApp.getActive();
  
  // Set the active sheet to 'Inputs' and get the filename from cell B15
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Inputs'), true);  
  var filename = spreadsheet.getRange("B15").getValue();
  
  // Create a new spreadsheet with the obtained filename
  var newSpreadsheet = SpreadsheetApp.create(filename);
  
  // Copy the 'Balance Sheet' sheet to the new spreadsheet and rename it
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Balance Sheet'), true);  
  SpreadsheetApp.getActiveSheet().copyTo(newSpreadsheet).setName("Balance Sheet");
  
  // Copy the 'Profit and Loss' sheet to the new spreadsheet and rename it
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Profit and Loss'), true);
  SpreadsheetApp.getActiveSheet().copyTo(newSpreadsheet).setName("Profit and Loss");
  
  // Delete the default 'Sheet1' from the new spreadsheet
  newSpreadsheet.deleteSheet(newSpreadsheet.getSheetByName("Sheet1"));

  // The shared folder ID where the new spreadsheet will be moved
  var folderID = "xxxxxxx3nTzzyS-I1pWzsejHDCh5"; // Replace with your shared folder ID
  var fileID = newSpreadsheet.getId();

  // Use the Drive API to move the file to the shared folder
  var file = DriveApp.getFileById(fileID);
  var folder = DriveApp.getFolderById(folderID);
  folder.addFile(file);
  DriveApp.getRootFolder().removeFile(file);
}

В качестве другого подхода, как насчет следующих модификаций?

Что касается but I still get errors when attempting to find the folder in the shared drive., к сожалению, судя по вашему вопросу, я не могу подтвердить фактическое сообщение об ошибке. Но, судя по вашему сценарию показа и текущей спецификации в редакторе сценариев, вы, возможно, протестировали свой сценарий показа, включив Drive API v3. На текущем этапе, когда Drive API включен в расширенных службах Google, версия 3 автоматически устанавливается в качестве версии по умолчанию. Если это так, возникает ошибка, поскольку resource вашего сценария показа предназначен для Drive API v2. Если я правильно понимаю, как насчет следующих примеров сценариев?

Используйте API Диска

Прежде чем протестировать это, включите Drive API v3 в расширенных службах Google. И, пожалуйста, установите идентификатор папки назначения на destinationFolderId.

/**
 * ### Description
 * Check whether Drive API is enabled at Advanced Google services, and return it as true or false and the version.
 * ref: https://medium.com/google-cloud/checking-api-enabled-with-advanced-google-services-using-google-apps-script-572bcdeb39a8
 *
 * @param {String} apiName API name you want to check.
 * @returns {Object} Object including "api" and "version" properties.
 */
function isAPIAtAdvancedGoogleServices_(apiName) {
  if (!apiName || apiName == "" || typeof apiName != "string") {
    throw new Error("Please set a valid API name.");
  } else if (!/^[A-Z]+$/g.test(apiName[0])) {
    const [t, ...b] = apiName;
    apiName = [t.toUpperCase(), ...b].join("");
  }
  const obj = { apiName, api: "disable" };
  if (typeof this[apiName] !== "undefined") {
    obj.api = "enable";
    obj.version = this[apiName].getVersion();
  }
  return obj;
}

function SaveNewFinancials() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Inputs'), true);  
  var filename = spreadsheet.getRange("B15").getValue();
  var newSpreadsheet = SpreadsheetApp.create(filename);
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Balance Sheet'), true);  
  SpreadsheetApp.getActiveSheet().copyTo(newSpreadsheet).setName("Balance Sheet");
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Profit and Loss'), true);
  SpreadsheetApp.getActiveSheet().copyTo(newSpreadsheet).setName("Profit and Loss");
  newSpreadsheet.deleteSheet(newSpreadsheet.getSheetByName("Sheet1"));


  // I modified the below script.
  const destinationFolderId = "###"; // Please set your destination folder ID (in shared drive).
  const sourceFileId = newSpreadsheet.getId();
  const check = isAPIAtAdvancedGoogleServices_("Drive");
  if (check.api == "enable" && check.version == "v3") {
    SpreadsheetApp.flush(); // I'm not sure whether this line is required.
    Drive.Files.update({}, sourceFileId, null, { addParents: destinationFolderId, enforceSingleParent: true, supportsAllDrives: true });
  } else {
    console.warn("Please enable Drive API v3 at Advanced Google services.");
  }
}

Используйте сервис Диска (DriveApp)

Что касается I've tried using moveTo and copyTo, but I learned that DriveApp doesn't play well with shared drives., когда я тестировал следующий скрипт для перемещения электронной таблицы на общий диск, я подтвердил, что электронную таблицу можно переместить с моего диска на общий диск. Итак, пожалуйста, протестируйте следующий скрипт.

Пожалуйста, установите идентификатор папки назначения на destinationFolderId.

function SaveNewFinancials() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Inputs'), true);  
  var filename = spreadsheet.getRange("B15").getValue();
  var newSpreadsheet = SpreadsheetApp.create(filename);
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Balance Sheet'), true);  
  SpreadsheetApp.getActiveSheet().copyTo(newSpreadsheet).setName("Balance Sheet");
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Profit and Loss'), true);
  SpreadsheetApp.getActiveSheet().copyTo(newSpreadsheet).setName("Profit and Loss");
  newSpreadsheet.deleteSheet(newSpreadsheet.getSheetByName("Sheet1"));


  // I modified the below script.
  const destinationFolderId = "###"; // Please set your destination folder ID (in shared drive).
  const sourceFileId = newSpreadsheet.getId();
  SpreadsheetApp.flush(); // I'm not sure whether this line is required.
  DriveApp.getFileById(sourceFileId).moveTo(DriveApp.getFolderById(destinationFolderId));
}

Примечание:

  • На текущем этапе методы «addFile(child)», «addFolder(child)», «removeFile(child)» и «removeFolder(child)» удалены, но их еще можно использовать. Ссылка.

Использованная литература:

Другие вопросы по теме