Я считаю, что ваша цель заключается в следующем.
Для указанной цели, как насчет этого ответа?
Проблема и обходные пути:
К сожалению, на данном этапе кажется, что идентификатор электронной таблицы и каждый идентификатор листа не могут быть напрямую получены из URL-адреса https://docs.google.com/spreadsheets/d/e/2PACX-###/pubhtml
. Я думаю, что это текущая спецификация. Также я думаю, что эта причина может быть из-за безопасности. Поэтому для достижения вашей цели необходимо подумать об обходном пути.
В этом ответе в качестве обходного пути я бы хотел достичь вашей цели с помощью веб-приложений, созданных в Google Apps Script. При использовании веб-приложений можно получить прямую ссылку Sheet2
.
Поток:
Этот обходной путь выглядит следующим образом.
- Загрузите Таблица Google в виде данных XLSX с URL-адресом
https://docs.google.com/spreadsheets/d/e/2PACX-###/pubhtml
. - Преобразование данных XLSX в таблицу Google.
- Publi sh преобразованная таблица Google в Интернет.
- Получить URL-адреса каждого листа.
Использование:
Пожалуйста, выполните следующую последовательность действий.
1. Создайте новый проект скрипта Google Apps.
Пример скрипта веб-приложений - это скрипт Google Apps. Поэтому, пожалуйста, создайте проект Google Apps Script.
Если вы хотите создать его напрямую, перейдите к https://script.new/. В этом случае, если вы не вошли в Google, откроется экран входа. Пожалуйста, войдите в Google. При этом открывается редактор сценариев Google Apps Script.
2. Подготовьте скрипт.
Скопируйте и вставьте следующий скрипт (Google Apps Script) в редактор скриптов. И , пожалуйста, включите Google Drive API в дополнительных сервисах Google . Этот сценарий предназначен для веб-приложений.
function doGet(e) {
const prop = PropertiesService.getScriptProperties();
const ssId = prop.getProperty("ssId");
if (ssId) {
DriveApp.getFileById(ssId).setTrashed(true);
prop.deleteProperty("ssId");
}
const inputUrl = e.parameter.url;
const re = new RegExp("(https?:\\/\\/docs\\.google\\.com\\/spreadsheets\\/d\\/e\\/2PACX-.+?\\/)");
if (!re.test(inputUrl)) return ContentService.createTextOutput("Wrong URL.");
const url = `${inputUrl.match(re)[1]}pub?output=xlsx`;
const blob = UrlFetchApp.fetch(url).getBlob();
const id = Drive.Files.insert({mimeType: MimeType.GOOGLE_SHEETS, title: "temp"}, blob).id;
prop.setProperty("ssId", id);
Drive.Revisions.update({published: true, publishedOutsideDomain: true, publishAuto: true}, id, 1);
const sheets = SpreadsheetApp.openById(id).getSheets();
const pubUrls = sheets.map(s => ({[s.getSheetName()]: `https://docs.google.com/spreadsheets/d/${id}/pubhtml?gid=${s.getSheetId()}`}));
return ContentService.createTextOutput(JSON.stringify(pubUrls)).setMimeType(ContentService.MimeType.JSON);
}
- В этом случае используется метод GET.
- В этом сценарии, когда выполняется приведенная ниже команда curl, Google Электронная таблица загружается как данные XLSX, а данные XLSX преобразуются в электронную таблицу Google. Затем преобразованная электронная таблица публикуется в Интернете. Этим можно получить прямые ссылки каждого листа.
- Кроме того, в этом сценарии предполагается, что исходная таблица была изменена. Поэтому, если вы снова запустите команду curl, существующая электронная таблица будет удалена, а новая электронная таблица будет создана путем загрузки из исходной электронной таблицы. В этом случае URL-адреса обновляются.
- Таким образом, если электронная таблица не изменилась, вы можете продолжать использовать полученные URL-адреса. Конечно, вы также можете напрямую использовать загруженную и преобразованную электронную таблицу.
3. Развертывание веб-приложений.
- В редакторе сценариев откройте диалоговое окно с помощью «Publi sh» -> «Развернуть как веб-приложение».
- Выберите «Я» " for " Запустите приложение как: ".
- Таким образом, скрипт запускается от имени владельца.
- Выберите "Любой, даже анонимный" для "У кого есть доступ к приложению: ".
- В этом случае токен доступа не требуется запрашивать. Я думаю, что я рекомендую этот параметр для вашей цели.
- Конечно, вы также можете использовать токен доступа. В это время установите «Anyone» .
- Нажмите кнопку «Развернуть» в качестве новой «версии проекта».
- Автоматически открывать диалоговое окно «Требуется авторизация».
- Нажмите «Просмотреть разрешения».
- Выберите собственную учетную запись.
- Нажмите «Дополнительно» в разделе «Это приложение не подтверждено».
- Нажмите " Go to ### имя проекта ### (небезопасно) "
- Нажмите кнопку" Разрешить ".
- Нажмите" ОК ".
- Скопируйте URL-адрес веб-приложений. Это как
https://script.google.com/macros/s/###/exec
. - Когда вы изменили скрипт Google Apps, пожалуйста, повторно разверните его как новую версию. Этим измененный сценарий отражается в веб-приложениях. Пожалуйста, будьте осторожны.
4. Запустите функцию с помощью веб-приложений.
Это пример команды curl для запроса веб-приложений. Укажите URL-адрес веб-приложения.
curl -L "https://script.google.com/macros/s/###/exec?url=https://docs.google.com/spreadsheets/d/e/2PACX-1vRrmEbjecLvXhbm409pa6JJXZd_ZXTG8Zt6OevIUs5Axq5oxlCZKU0QXk-2lW05HyXJ2B4Bzy3bG-4L/pubhtml"
- В этом случае метод GET используется на стороне веб-приложения. Таким образом, вы также можете напрямую получить доступ к вышеуказанному URL-адресу с помощью браузера.
Примечание:
- Когда вы изменили сценарий веб-приложений, пожалуйста, повторно разверните Интернет Приложения как новая версия. Таким образом, последний скрипт отражается в веб-приложениях. Пожалуйста, будьте осторожны.
В этом ответе я подумал, что вы можете использовать это извне. Поэтому я использовал веб-приложения. Если вы хотите напрямую получить данные из скрипта Служб Google, вы также можете использовать следующий скрипт:
function myFunction() {
const inputUrl = "https://docs.google.com/spreadsheets/d/e/2PACX-1vRrmEbjecLvXhbm409pa6JJXZd_ZXTG8Zt6OevIUs5Axq5oxlCZKU0QXk-2lW05HyXJ2B4Bzy3bG-4L/pubhtml";
const prop = PropertiesService.getScriptProperties();
const ssId = prop.getProperty("ssId");
if (ssId) {
DriveApp.getFileById(ssId).setTrashed(true);
prop.deleteProperty("ssId");
}
const re = new RegExp("(https?:\\/\\/docs\\.google\\.com\\/spreadsheets\\/d\\/e\\/2PACX-.+?\\/)");
if (!re.test(inputUrl)) throw new Error("Wrong URL.");
const url = `${inputUrl.match(re)[1]}pub?output=xlsx`;
const blob = UrlFetchApp.fetch(url).getBlob();
const id = Drive.Files.insert({mimeType: MimeType.GOOGLE_SHEETS, title: "temp"}, blob).id;
prop.setProperty("ssId", id);
Drive.Revisions.update({published: true, publishedOutsideDomain: true, publishAuto: true}, id, 1);
const sheets = SpreadsheetApp.openById(id).getSheets();
const pubUrls = sheets.map(s => ({[s.getSheetName()]: `https://docs.google.com/spreadsheets/d/${id}/pubhtml?gid=${s.getSheetId()}`}));
console.log(pubUrls); // You can see the URLs for each sheet at the log.
}
Ссылки:
Добавлено:
В качестве другого обходного пути, когда исходная таблица часто изменяется, а число листов постоянно исходную электронную таблицу, а затем, если вы хотите получить только значения, вы также можете использовать следующий скрипт. В этом сценарии URL-адрес не изменяется даже при повторном запуске сценария. Таким образом, вы можете продолжать использовать URL.
Пример сценария:
function myFunction() {
const inputUrl = "https://docs.google.com/spreadsheets/d/e/2PACX-1vRrmEbjecLvXhbm409pa6JJXZd_ZXTG8Zt6OevIUs5Axq5oxlCZKU0QXk-2lW05HyXJ2B4Bzy3bG-4L/pubhtml";
const re = new RegExp("(https?:\\/\\/docs\\.google\\.com\\/spreadsheets\\/d\\/e\\/2PACX-.+?\\/)");
if (!re.test(inputUrl)) throw new Error("Wrong URL.");
const url = `${inputUrl.match(re)[1]}pub?output=xlsx`;
const blob = UrlFetchApp.fetch(url).getBlob();
const prop = PropertiesService.getScriptProperties();
let sheets;
let ssId = prop.getProperty("ssId");
if (ssId) {
const temp = Drive.Files.insert({mimeType: MimeType.GOOGLE_SHEETS, title: "tempSpreadsheet"}, blob).id;
const tempSheets = SpreadsheetApp.openById(temp).getSheets();
sheets = SpreadsheetApp.openById(ssId).getSheets();
tempSheets.forEach((e, i) => {
const values = e.getDataRange().getValues();
sheets[i].getRange(1, 1, values.length, values[0].length).setValues(values);
});
DriveApp.getFileById(temp).setTrashed(true);
} else {
ssId = Drive.Files.insert({mimeType: MimeType.GOOGLE_SHEETS, title: "copiedSpreadsheet"}, blob).id;
Drive.Revisions.update({published: true, publishedOutsideDomain: true, publishAuto: true}, ssId, 1);
prop.setProperty("ssId", ssId);
sheets = SpreadsheetApp.openById(ssId).getSheets();
}
const pubUrls = sheets.map(s => ({[s.getSheetName()]: `https://docs.google.com/spreadsheets/d/${ssId}/pubhtml?gid=${s.getSheetId()}`}));
console.log(pubUrls); // You can see the URLs for each sheet at the log.
}