Ссылка на конкретный лист c в опубликованном Google Sheet - PullRequest
0 голосов
/ 26 апреля 2020

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

Я ищу ссылку на конкретный лист c рабочей книги, который был опубликован. Я сделал простую рабочую книгу для тестирования, и опубликованная ссылка выглядит следующим образом: https://docs.google.com/spreadsheets/d/e/2PACX-1vRrmEbjecLvXhbm409pa6JJXZd_ZXTG8Zt6OevIUs5Axq5oxlCZKU0QXk-2lW05HyXJ2B4Bzy3bG-4L/pubhtml

Как вы можете видеть, есть верхнее меню для переключения между листами, но это не влияет на URL.

Можно ли как-нибудь напрямую получить URL для "Sheet2"? Или это зависит от наличия идентификатора листа (я не являюсь владельцем указанной таблицы)?

1 Ответ

1 голос
/ 27 апреля 2020

Я считаю, что ваша цель заключается в следующем.

Для указанной цели, как насчет этого ответа?

Проблема и обходные пути:

К сожалению, на данном этапе кажется, что идентификатор электронной таблицы и каждый идентификатор листа не могут быть напрямую получены из URL-адреса https://docs.google.com/spreadsheets/d/e/2PACX-###/pubhtml. Я думаю, что это текущая спецификация. Также я думаю, что эта причина может быть из-за безопасности. Поэтому для достижения вашей цели необходимо подумать об обходном пути.

В этом ответе в качестве обходного пути я бы хотел достичь вашей цели с помощью веб-приложений, созданных в Google Apps Script. При использовании веб-приложений можно получить прямую ссылку Sheet2.

Поток:

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

  1. Загрузите Таблица Google в виде данных XLSX с URL-адресом https://docs.google.com/spreadsheets/d/e/2PACX-###/pubhtml.
  2. Преобразование данных XLSX в таблицу Google.
  3. Publi sh преобразованная таблица Google в Интернет.
  4. Получить 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. Развертывание веб-приложений.

  1. В редакторе сценариев откройте диалоговое окно с помощью «Publi sh» -> «Развернуть как веб-приложение».
  2. Выберите «Я» " for " Запустите приложение как: ".
    • Таким образом, скрипт запускается от имени владельца.
  3. Выберите "Любой, даже анонимный" для "У кого есть доступ к приложению: ".
    • В этом случае токен доступа не требуется запрашивать. Я думаю, что я рекомендую этот параметр для вашей цели.
    • Конечно, вы также можете использовать токен доступа. В это время установите «Anyone» .
  4. Нажмите кнопку «Развернуть» в качестве новой «версии проекта».
  5. Автоматически открывать диалоговое окно «Требуется авторизация».
    1. Нажмите «Просмотреть разрешения».
    2. Выберите собственную учетную запись.
    3. Нажмите «Дополнительно» в разделе «Это приложение не подтверждено».
    4. Нажмите " Go to ### имя проекта ### (небезопасно) "
    5. Нажмите кнопку" Разрешить ".
  6. Нажмите" ОК ".
  7. Скопируйте 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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...