使用Google表格API将图片插入Google表格单元格

ded*_*les 8 javascript google-sheets google-sheets-api

在Google Apps脚本中,您可以使用该insertImage功能(https://developers.google.com/apps-script/reference/spreadsheet/sheet#insertimageblob-column-row)将图像插入Google电子表格.

但我没有使用appscript.我正在使用Google表格API(https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets),我似乎找不到办法来做到这一点.有没有可能的实施?

Ed *_*son 7

用这样的脚本设置公式:

function showImage() {
 var ss=SpreadsheetApp.getActiveSpreadsheet() 
 var formulaSheet = ss.getSheetByName("Sheet1");
 var formulaCell = formulaSheet.getRange("B5");
 formulaCell.setFormula('=IMAGE("http://finviz.com/fut_chart.ashx?t=ES&p&p=m5&s=m",4,100,200)')
}
Run Code Online (Sandbox Code Playgroud)


Sam*_*lin 7

V4 API无法像Apps Script一样插入图像斑点(图像是工作表上的覆盖层,与任何单元都不相关)。您可以使用= IMAGE函数解决此问题。我们知道功能上的差距,并正在考虑增加对图像斑点的支持。

  • 是的,我编写了Sheets V4 API。 (5认同)

Tim*_*hns 5

在此期间,此 Google Apps Script Web App 将执行此操作(出于隐私和安全考虑,我建议托管您自己的而不是使用此应用程序)。

这适用于 JSON 或 application/x-www-form-urlencoded,以及传递的 URL 是链接还是实际的 base64 编码图像 url,就像您可能从https://www.base64-image.de/获得的一样 。

function doGet(e) {
  return ContentService.createTextOutput("Authorization: Bearer " + ScriptApp.getOAuthToken())
}

//
// Example curl command to insert an image:
// 
// curl -L -d '{ "spreadsheetid": "1xNDWJXOekpBBV2hPseQwCRR8Qs4LcLOcSLDadVqDA0E","sheetname": "Sheet1", "imageurl": "https://www.google.com/images/srpr/logo3w.png", "column": 1, "row": 1 }' \
// -H "Authorization: Bearer <INSERT TOKEN RETURNED FROM GET HERE>" \
// -H 'Content-Type: application/json' \
// https://script.google.com/a/tillerhq.com/macros/s/AKfycbzjFgIrgCfZTvOHImuX54G90VuAgmyfz2cmaKjrsNFrTzcLpNk0/exec
//

var REQUIRED_PARAMS = [
  'spreadsheetid', // example: "1xNDWJXOekpBBV2hPseQwCRR8Qs4LcLOcSLDadVqDA0E"
  'sheetname',     // Case-sensitive; example: "Sheet1"
  'imageurl',      // Can be an url such as "https://www.google.com/images/srpr/logo3w.png"
                   // or alternately "data:image/png;base64,iVBOR...<snip>...gg=="
  'column', // 1-based (i.e. top left corner is column 1)
  'row'     // 1-based (i.e. top left corner is row 1)
];

function doPost(e) {

  var result = {
    status: "ok",
    defaultMessage: "Image inserted."
  }

  try {
    var params = (e.postData && e.postData.type == "application/x-www-form-urlencoded") ? e.parameter
    : (e.postData && e.postData.type == "application/json") ? JSON.parse(e.postData.contents)
    : undefined;


    if (!params) throw new Error('Unsupported content-type, must be either application/x-www-form-urlencoded or application/json.');

    REQUIRED_PARAMS.forEach(function(requiredParam) {
      if (!params[requiredParam]) throw new Error('Missing required parameter ' + requiredParam);
    });

    SpreadsheetApp.openById(params.spreadsheetid).getSheetByName(params.sheetname).insertImage(params.imageurl, params.column, params.row);  

  } catch(e) {

    console.error(e); 

    result.status = "error";
    result.error = e;
    result.defaultMessage = e.message;

  }  

  return ContentService.createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON)  
}
Run Code Online (Sandbox Code Playgroud)

两件我从未想过的令人费解的事情:

在访问 Web 应用程序的 URL 并接受权限后,它在 Postman 内部一直运行良好(大概是使用 cookie 进行身份验证的)。不幸的是,直到我在清单中手动添加https://www.googleapis.com/auth/drive之前,我无法使用 ScriptApp.getOAuthToken() 中返回的 Oauth 令牌从 curl 开始工作——这仍然是一个对我来说有点头疼。

这是我的结果清单:

{
  "timeZone": "America/Los_Angeles",
  "dependencies": {
  },
  "webapp": {
    "access": "ANYONE",
    "executeAs": "USER_ACCESSING"
  },
  "exceptionLogging": "STACKDRIVER",
  "oauthScopes": ["https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive"]
}
Run Code Online (Sandbox Code Playgroud)

我也无法让它工作转换为 Blob 并将其传递给 insertImage(),但是 insertImage 的 URL 风格与完整的 Base 64 编码图像 URL 一起工作得很好,所以这有点烦人,但这似乎合理可行,直到Sheets API 获得了该功能。

脚本(源代码)本身与这里的世界共享只读:

https://script.google.com/d/1JvFwemL45x3orxFiJf_Gye-JWXaFlzA_MysJsQx06LsH8M2psa9i1H99/edit?usp=sharing

并且它也在此处公开部署,如果您想在不部署自己的情况下对其进行测试,请使用它:

https://script.google.com/a/tillerhq.com/macros/s/AKfycbzjFgIrgCfZTvOHImuX54G90VuAgmyfz2cmaKjrsNFrTzcLpNk0/exec

  • 蒂姆