У меня есть сценарий, который создает новую электронную таблицу и копирует две вкладки с текущего листа на новый. Я бы предпочел, чтобы новый лист сохранялся в папке общего диска, а не в папке «Мой диск». Ниже приведена текущая итерация, над которой я работаю. Закомментированные строки - это те, которые не работают.
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 не очень хорошо работает с общими дисками. Я также не думаю, что мне нужен идентификатор диска, но я видел его в нескольких других ответах здесь, поэтому добавил его в своей последней попытке. Заранее благодарю за любую помощь!
попробуйте вот так:
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. Если я правильно понимаю, как насчет следующих примеров сценариев?
Прежде чем протестировать это, включите 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.");
}
}
Что касается 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));
}