Внутренняя ошибка сервера при изменении имени шрифта диаграммы через API - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь обновить форматирование диаграмм с помощью запроса Sheets API UpdateChartSpec. Однако скрипт возвращает ошибку:

«Вызов API для sheet.spreadsheets.batchUpdate завершился ошибкой: обнаружена внутренняя ошибка»

Вот фрагмент моего кода, который вызывает исключение:

var request = [{
  'updateChartSpec': {
    'chartId': chart_id,
    'spec': {
      'fontName': 'Arial',
      'basicChart': {          //to update font name, it seems that chart type should be provided
        'chartType': 'BAR' 
      }
    }      
  }
}];

Sheets.Spreadsheets.batchUpdate({'requests': request}, spreadsheet_id);

Кто-нибудь может сказать, что не так с запросом, если что-нибудь?

1 Ответ

2 голосов
/ 09 апреля 2019

Согласно разделу «Образцы» в описании API Google Sheets, вы не можете выполнить частичное обновление спецификации диаграммы - вы должны заменить существующую спецификацию совершенно новой спецификацией.

Если вы просто хотите немного изменить текущую спецификацию, тогда самый простой подход -

  1. Запрос текущего chartSpec
  2. Изменить необходимые биты
  3. Выпустить обновление с (всей) измененной спецификацией.

В Apps Script это может быть реализовано так:

function getChartSpecs(wkbkId) {
  const fields = "sheets(charts(chartId,spec),properties(sheetId,title))";
  var resp = Sheets.Spreadsheets.get(wkbkId, { fields: fields });
  // return an object mapped by chartId, storing the chart spec and the host sheet.
  return resp.sheets.reduce(function (obj, sheet) {
    if (sheet.charts) {
      sheet.charts.forEach(function (chart) {
        obj[chart.chartId] = {
          spec: chart.spec,
          sheetName: sheet.properties.title,
          sheetId: sheet.properties.sheetId
        };
      });
    }
    return obj;
  }, {});
}
function makeChartUpdateRequest(chartId, newSpec) {
  return {
    updateChartSpec: {
      chartId: chartId,
      spec: newSpec
    }
  };
}
function setNewFontOnChart(newFontName, chartId, chartSpecs) {
  const wb = SpreadsheetApp.getActive();
  const wbId = wb.getId();
  if (!chartSpecs)
    chartSpecs = getChartSpecs(wbId);

  var requests = [];
  if (!chartId) { // Update all charts
    requests = Object.keys(chartSpecs).map(function (id) {
      var chart = chartSpecs[id];
      chart.spec.fontName = newFontName;
      return makeChartUpdateRequest(id, chart.spec);
    });
  } else if (chartSpecs[chartId]) { // Update just one chart.
    chartSpecs[chartId].spec.fontName = newFontName;
    requests.push(makeChartUpdateRequest(chartId, chartSpecs[chartId].spec));
  } else {
    // oops, the given chartId is not valid.
  }
  if (requests.length) {
    Sheets.Spreadsheets.batchUpdate({ requests: requests }, wbId);
  }
}

Полезные ссылки:

...