Отправить изображение из Google Sheets (Google Disk) в Telegram bot

#google-apps-script #google-sheets #telegram #google-docs #google-docs-api

#google-приложения-скрипт #google-sheets #telegram #google-docs #google-docs-api

Вопрос:

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

Если я отправлю ссылку с Google Диска в Telegram таким образом: сначала попробуйте:

 file_id_0 = "https://drive.google.com/file/d/1kvitP05ofdyT4YtHgNBdjP-sxIFQlpo7/view?usp=drivesdk";
 

Это результат первой попытки: первая попытка — плохо: я хочу видеть только изображение в чате Telegram — без ссылок.
введите описание изображения здесь

На этом сайте я нашел решение этой проблемы (извините, я потерял ссылку): используйте документы Google с file_id с Google Диска. Идентификатор файла при соединении между «/ d / file_id / view». Чтобы подтвердить это решение, я взял идентификатор какого-то другого файла на Google Диске и объединил его:

 file_id_2 = "1bSSzt5S9SgafeAK7D6dfRiFGECxhSuXo";
sendImage(chatId, "https://docs.google.com/uc?id="   file_id_2);
 

Результат второй попытки: Вторая попытка — это идеально — то, что мне нужно!
введите описание изображения здесь

Теперь я пытаюсь извлечь file_id из файла Google Drive file.getId() и объединить этот идентификатор со ссылкой на документы Google.

Результат третьей попытки: третья попытка — неудачная. введите описание изображения здесьЕсли я возьму ссылку в debug programm и открою ее в браузере — это откроется правильно (как и во второй попытке). На мой взгляд, ссылка на вторую и третью ссылку без различий. По крайней мере, они корректно открываются в браузере.

Как я должен вставить эту ссылку в свою функцию, чтобы не было проблем?

P.S: Прошу прощения за мой английский. Я готов дать любые объяснения и надеюсь, что фотографии помогли понять мою проблему.

Полный код:

 function downloadChart2() {
  let chatId = "-xxx";
  var sheet = SpreadsheetApp.getActiveSheet();

  // Get chart and save it into your Drive
  var chart = sheet.getCharts()[0];
  var file = DriveApp.createFile(chart.getBlob());

  // Set url in one cell and resize the column 
  sheet.getRange(23, 1).setValue(file.getUrl())
  sheet.autoResizeColumn(1);
  file.setName("1234");

  // first try - successful, but bad view on Telegram
  var file_id_0 = file.getUrl();
  sendText(chatId, file_id_0);

  // second try - successful, but i grab this id on adress panel in my brouser
  var file_id_1 = "1cAdAMWFdzZFRgXiM9kbxkzrwVAGpoOIy";
  sendImage(chatId, "https://docs.google.com/uc?id="   file_id_1);

  // third try - unsuccessful
  var file_id_2 = file.getId();
  var file_id_3 = "https://docs.google.com/uc?id="   file_id_2; // this link correctly
  sendImage(chatId, file_id_3); // but this don't work
  }
  }

function sendImage(chatId, text, keyBoard) {

  let data = {
    method: 'post',
    payload: {
      method: 'sendMessage',
      chat_id: String(chatId),
      text: text,
      parse_mode: 'HTML',
      reply_markup: JSON.stringify(keyBoard)
    }
  }
  var caption = "Second";
   UrlFetchApp.fetch("https://api.telegram.org/bot"   token   "/sendPhoto?caption="   encodeURIComponent(caption)   "amp;photo="   encodeURIComponent(text)   "amp;chat_id=" 
     chatId   "amp;parse_mode=HTML");
}
 

Ответ №1:

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

От:

 var file = DriveApp.createFile(chart.getBlob());
 

Для:

 var file = DriveApp.createFile(chart.getBlob());
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
 

Ссылка: