使用 Google Sheets API 将图像插入 Google Sheets 单元格
Insert image into Google Sheets cell using Google Sheets API
在 google 应用程序脚本中,您可以使用 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),但我似乎无法找到执行此操作的方法。有没有可能的实现?
使用如下脚本设置公式:
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)')
}
V4 API 无法像 Apps 脚本那样插入图像 blob(其中图像是 sheet 上的叠加层,不与任何单元格关联)。您可以使用 =IMAGE 函数解决此问题。我们知道功能上的差距,正在研究添加对图像 blob 的支持。
在此期间,这个 Google Apps Script Web App 可以做到(为了隐私和安全,我建议您自己托管而不是使用这个)。
这适用于 JSON 或 application/x-www-form-urlencoded,传递的 URL 是 link 还是像您一样的实际 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)
}
两件我一直想不通的事情:
在访问 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"]
}
我也从来没有能够让它工作转换为 Blob 并将其传递给 insertImage(),但是 insertImage 的 URL 风格非常适合完整的 Base 64 编码图像 URLs,所以这有点烦人,但在 Sheets API 获得功能之前,这似乎是合理可行的。
脚本(源)本身在此处与世界共享 read-only:
它也在此处公开部署,如果您想在不部署自己的情况下对其进行测试,请尝试一下:
- 蒂姆
在 google 应用程序脚本中,您可以使用 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),但我似乎无法找到执行此操作的方法。有没有可能的实现?
使用如下脚本设置公式:
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)')
}
V4 API 无法像 Apps 脚本那样插入图像 blob(其中图像是 sheet 上的叠加层,不与任何单元格关联)。您可以使用 =IMAGE 函数解决此问题。我们知道功能上的差距,正在研究添加对图像 blob 的支持。
在此期间,这个 Google Apps Script Web App 可以做到(为了隐私和安全,我建议您自己托管而不是使用这个)。
这适用于 JSON 或 application/x-www-form-urlencoded,传递的 URL 是 link 还是像您一样的实际 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)
}
两件我一直想不通的事情:
在访问 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"]
}
我也从来没有能够让它工作转换为 Blob 并将其传递给 insertImage(),但是 insertImage 的 URL 风格非常适合完整的 Base 64 编码图像 URLs,所以这有点烦人,但在 Sheets API 获得功能之前,这似乎是合理可行的。
脚本(源)本身在此处与世界共享 read-only:
它也在此处公开部署,如果您想在不部署自己的情况下对其进行测试,请尝试一下:
- 蒂姆