Скрипт приложения Google иногда не может вставить изображение в электронную таблицу - PullRequest
1 голос
/ 06 апреля 2020

Мой проект был написан Ruby на Rails, поскольку гем google-api-client не поддерживает вставку изображения в электронную таблицу через apis листа, поэтому я использую скрипт приложения Google для решения этой задачи. В большинстве случаев вставка была успешной с этим вызовом:

@app_script.run_script(script_id, request) 

Я просто предоставляю свой сценарий для всех, кому интересно: https://script.google.com/a/vectorgroup.vn/d/1ndcgpfJMj3YdKj0pEvHWz0pF4NtcQyR1Qg8wj7ZnpKfIwP2UsH0xaYq4/edit?splash=yes

иногда возникает проблема, при сбое вызова происходит следующая ошибка:

Сведения об ошибке: [{\ "@ type \" => \ "type.googleapis.com/google.apps.script.v1. ExecutionError \ ", \" scriptStackTraceElements \ "=> [{\" function \ "=> \" addImageOnSpreadsheet \ "}], \" errorMessage \ "=> \" Исключение: ошибка при получении изображения с URL или неверный URL: https://drive.google.com/uc?id=1MS6KMfua7kZCSGMUhny4kDUvalxTkoKJ&export=download \ ", \" errorType \ "=> \" ScriptError \ "}]" 2020-04-06T06: 03: 33.821Z pid = 26645 tid = tz8bh class = ImageTakerWorker jid = d847bf91beea8aeb4a30b042 истекло = 11,689 ИНФОРМАЦИЯ: выполнено Ошибка: 3 "" Сведения об ошибке: [{\ "@ type \" => \ "type.googleapis.com/google.apps.script.v1.ExecutionError \", \ "scriptStackTraceElements \" => [{ \ "function \" => \ "addImageOnSpreadsheet \"}], \ "errorMessage \" => \ "Исключение: ошибка при получении изображения с URL-адреса или неверного URL-адреса: https://drive.google.com/uc?id=1G9EDgvygwVztMG66FArZ6BEFpzW71izA&export=download \", \ "errorType \ "=> \" ScriptError \ "}]" 2020-04-06T08: 00: 28.330Z pid = 26645 tid = tz7zl class = ImageTakerWorker jid = a6b4fcb47db15f71dbf1d3f5 elapsed = 6.514 ИНФОРМАЦИЯ: выполнено "Вставить изображение ОШИБКА: #, #" "Ошибка: 3" "Сведения об ошибке: [{\" @ type \ "=> \" тип. googleapis.com/google.apps.script.v1.ExecutionError \ ", \" scriptStackTraceElements \ "=> [{\" function \ "=> \" addImageOnSpreadsheet \ "}], \" errorMessage \ "=> \" Exception : Ошибка при получении изображения из URL или неверный URL: https://drive.google.com/uc?id=1_3KzBDDgpINMCNkEZj2LivqdUaxFKZNT&export=download \ ", \" errorType \ "=> \" ScriptError \ "}]" 2020-04-06T08: 00: 28.941Z pid = 26645 tid = tzahx class = ImageTakerWorker jid = 8010f8c64cb9a0efa672b713 elapsed = 7.121 INFO: выполнено

Похоже, что проблема возникает с URL-адресом, так как скрипт приложения Google не может извлечь данные изображения. Но когда возникает проблема, я просто копирую и вставляю вышеуказанный URL изображения в журнал ошибок в браузер вручную, он может успешно загрузить изображение. Обратите внимание, что я уже установил publi c для URL изображения.

Ниже приведена часть скрипта моего приложения Google:

class GoogleAppScript
  APPLICATION_NAME = "Insert image to spreadsheet".freeze

  def initialize(user_id, sheet_id, options = {})
    @user = User.find(user_id)
    @sheet_id = sheet_id
    @from_class = options[:from_class]
    @service = options[:service]
    @keyword = options[:keyword]
    @sheet_name = options[:service] == "google" ? "G" + options[:keyword].strip : "Y" + options[:keyword].strip
    @image_file_id = options[:image_file_id]
    @google_authorization = GoogleAuthorization.new(@user).authorize
    @app_script = Google::Apis::ScriptV1::ScriptService.new
    @app_script.client_options.application_name = APPLICATION_NAME
    @app_script.authorization = @google_authorization
  end

  def execute
    script_id = "1ndcgpfJMj3YdKj0pEvHWz0pF4NtcQyR1Qg8wj7ZnpKfIwP2UsH0xaYq4"
    url_image = "https://drive.google.com/uc?id=#{@image_file_id}&export=download"

    start_col = 1
    if @from_class == "ImageX"
      start_row = 51
      width = 692
      height = 1500
    else # "ImageY"
      start_row = @keyword.last == " " ? 30 : 9
      width = 694
      height = 418
    end
    request = Google::Apis::ScriptV1::ExecutionRequest.new(
      function: "addImageOnSpreadsheet",
      parameters: [@sheet_id, @sheet_name, url_image, start_col, start_row, width, height],
    )

    begin
      response = @app_script.run_script(script_id, request)
      if response.error
        # Retry until success
        # ImageTakerWorker.perform_async(@user.id, @sheet_id, @sheet_name, @image_file_id)
        p "Insert image ERROR: #{response}, #{response.error}"
        p "Error: #{response.error.code}"
        p "Error detail: #{response.error.details}"
      else
        p "Insert image successfully"
      end
    rescue Google::Apis::ClientError
      # Handle the error...
    end
  end
end

У кого-нибудь есть опыт по этому поводу?

1 Ответ

2 голосов
/ 07 апреля 2020
  • В вашей ситуации при вставке изображения в электронную таблицу Google возникает ошибка Server error.
    • В этом случае считается, что размер изображения превышает ограничение. Ссылка
  • Вы хотите изменить размер изображения, когда размер ограничения для вставки в таблицу Google закончится.

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

Проблема и обходное решение:

В этом случае, даже если используются setWidth и setHeight, ошибка не может быть удалена. Потому что ошибка возникает при вставке изображения. Поэтому в этом ответе я хотел бы предложить вставить изображение, изменив размеры в библиотеке скриптов Google Apps.

Модифицированный скрипт:

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

function addImageOnSpreadsheet(spreadsheet_id, sheet_name, image_file_id, column, row, width, height) {
  let blobSource = DriveApp.getFileById(image_file_id).getBlob();
  const obj = ImgApp.getSize(blobSource);
  if (obj.height * obj.width > 1048576) {
    blobSource = ImgApp.doResize(image_file_id, width).blob;
  }
  let image = SpreadsheetApp.openById(spreadsheet_id).insertImage(blobSource, column, row);
  image.setWidth(width).setHeight(height);
}
  • . В качестве теста я рекомендую запускать сценарий непосредственно в редакторе сценариев.

Примечание:

  • В этом случае используются следующие 3 области. Хотя я не уверен относительно всего вашего сценария, пожалуйста, добавьте эти области. Пожалуйста, будьте осторожны с этим. В вашем случае, пожалуйста, добавьте области и повторите авторизацию. Таким образом, может быть использован действительный токен доступа.

Ссылки:

Добавлено:

Пример сценария:

Этот пример сценария предназначен для получения нескольких идентификаторов файлов.

function addImageOnSpreadsheet(ar) {
  ar.forEach(o => {
    let blobSource = DriveApp.getFileById(o.image_file_id).getBlob();
    const obj = ImgApp.getSize(blobSource);
    if (obj.height * obj.width > 1048576) {
      blobSource = ImgApp.doResize(o.image_file_id, o.width).blob;
    }
    var image = SpreadsheetApp.openById(o.spreadsheet_id).insertImage(blobSource, o.column, o.row);
    image.setWidth(o.width).setHeight(o.height);
  });
}
  • Для примера ar выглядит следующим образом.

    ar = [
      {spreadsheet_id: "###", image_file_id: "###", column: ##, row: ##, width: ###, height: ###},
      {spreadsheet_id: "###", image_file_id: "###", column: ##, row: ##, width: ###, height: ###},
      ,
      ,
    ];
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...