标签: google-apps-script

Google 脚本 oauth2 错误:redirect_uri_mismatch

我不会在没有搜索和阅读文档的情况下问这个问题。到目前为止我花了2天。我确定我错过了什么。我正在尝试在驱动器电子表格上实施谷歌身份验证。我已经尝试了所有方法,但仍然收到错误消息(redirect_uri_mismatch)。基本上,我想要一个带有登录屏幕的侧面板。当用户允许访问时,用户单击按钮,auth magic 运行并重定向到另一个打印“成功”的 html。

  1. 我在谷歌开发控制台中创建了一个项目。
  2. 创建凭据
    2.1 客户端 ID:
    131579675294-jc1c0ckuaa7n7ih7eevg19cisthgt00e.apps.googleusercontent.com

    2.2 客户端密码:XaebFsC18qfMmcZJKgokLEYo

  3. 设置回调uri:
    https://script.google.com/macros/d/MCgMJPIdD1bbeG1PsFaNug8uUifae5TWT/usercallback

  4. 项目密钥: MCgMJPIdD1bbeG1PsFaNug8uUifae5TWT

    脚本 ID: 1DYEShH45-AtikbEwfAG8w9P7Y39FHhCB-nGHWHOW4mUtq5DZLvubDxev

    据说 projectKey 已被弃用,而是需要使用脚本 ID,但两者都不起作用。

  5. 我使用 oauth2 所以我添加了外部库:1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF

  6. 说明:我的 gs 文件有以下代码。我有一个侧边栏,上面有一个按钮,单击时会调用 onSignIn()。我希望通过身份验证访问电子表格。首先,我想查看授权页面。接受后,我希望它重定向到一个页面,即 callback_uri 并显示一些简单的内容。但是它确实给了我错误。具有讽刺意味的是,我创建的端点浏览器链接工作并成功重定向。

端点浏览器链接

https://accounts.google.com/o/oauth2/auth?redirect_uri=https%3A%2F%2Fscript.google.com%2Fmacros%2Fd%2FMCgMJPIdD1bbeG1PsFaNug8uUifae5TWT%2Fusercallback&response_type=code&client_id=131579675294-jc1c0ckuaa7n7ih7eevg19cisthgt00e.apps.googleusercontent.com&approval_prompt= force&scope=https%3A%2F%2Fdocs.google.com%2Ffeeds

我究竟做错了什么?感谢您的帮助。谢谢。

    var CLIENT_ID = '131579675294-jc1c0ckuaa7n7ih7eevg19cisthgt00e.apps.googleusercontent.com';

    var CLIENT_SECRET = 'XaebFsC18qfMmcZJKgokLEYo';

    function onSignIn() {
        var service = getService();
        if (!service.hasAccess()) {
          var authorizationUrl = service.getAuthorizationUrl();
          var template = HtmlService.createTemplate('<a href="<?= authorizationUrl ?>" target="_blank">Authorize</a>');
          template.authorizationUrl = authorizationUrl;
          var page = template.evaluate();
          return HtmlService.createHtmlOutput( page);
        }
    } …
Run Code Online (Sandbox Code Playgroud)

google-sheets google-apps-script oauth2

1
推荐指数
1
解决办法
6264
查看次数

getValues() 返回未定义

我正在尝试将一些数据从一张纸复制并粘贴到另一张纸上。我有以下数据结构->

我要复制的内容(sheet1):

dataname  value
data1     value1
data2     value2
data3     value3
data4     value4
Run Code Online (Sandbox Code Playgroud)

最终结果(sheet2):

day1 value1 value2 value3 value4
day2 value1 value2 value3 value4
day3 value1 value2 value3 value4
Run Code Online (Sandbox Code Playgroud)

如您所知,sheet1 上的数据每天都会刷新并复制到 sheet2 上。

这是我正在使用的脚本:

function getdata() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1");;
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet2")
  var data = ss.getRange('B1:B10').getValues()[0][0];
  sheet.appendRow([data[1],data[1],data[2],data[3],data[4],data[5],data[6]]);
}
Run Code Online (Sandbox Code Playgroud)

我知道这是一个非常基本的问题,但我仍然不明白getValues()真正的工作原理。使用上面的脚本,我得到以下结果:

undefined undefined undefined undefined undefined undefined undefined
Run Code Online (Sandbox Code Playgroud)

这是为什么 ?我该怎么办 ?

谢谢 !

google-apps-script

1
推荐指数
1
解决办法
1万
查看次数

根据谷歌电子表格中的单元格颜色更改单元格值

我一直在寻找一种基于另一种单元格颜色更改单元格值(例如,如果单元格颜色为红色则为“文本”)的方法?

有没有办法做到这一点?

我知道有一种方法可以根据单元格值更改单元格颜色,但我想要相反的方式,

有人有想法吗?无论是脚本还是公式

google-sheets google-apps-script

1
推荐指数
1
解决办法
8187
查看次数

如何修复错误 - 无效参数:file.contentType,在创建新的 Google 表格时

我正在尝试在创建的文件夹中创建一个新的 Google 表格,但内容类型有问题。

我已经搜索了这个错误,但没有找到任何东西。大多数搜索都会出现MimeType错误,但我认为这不是问题所在。下面是我正在使用的代码:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var newFolder = DriveApp.getFolderById("MyID").createFolder("New Folder");
newFolder.createFile("myFileName",ss,MimeType.GOOGLE_DOCS);
Run Code Online (Sandbox Code Playgroud)

每当我在电子表格中运行它时,都会收到以下错误:

无效参数:file.contentType(第 3 行,文件“代码”)

我曾尝试使用“”作为createFile.

google-sheets google-apps-script

1
推荐指数
1
解决办法
4581
查看次数

如何通过 Google Apps Script Web App 将 jpg 或 png 图像转换为 Blob?

我想将 html 表单中的图像通过 http 发布到谷歌应用程序脚本网络应用程序,然后将该图像添加到谷歌驱动器。

我的应用程序脚本如下。

function doPost(e){
  var date = new Date();
  var timestamp = date.toString()
  var adress = e.parameter.adress;
  var cost = e.parameter.cost;
  var item = e.parameter.item;
  var check = e.parameter.image;

  //add file to drive
  var destination_id = "some ID"
  var destination = DriveApp.getFolderById(destination_id);
  destination.createFile(check);
};
Run Code Online (Sandbox Code Playgroud)

当我执行时,它返回一个错误; cannot find method: createFile(String)

我认为这是因为“检查”是一个字符串,我想将提交的图像转换为Blob。

我怎样才能做到这一点?

blob web-applications google-apps-script

1
推荐指数
1
解决办法
4015
查看次数

Google Apps Script - 在独立脚本上使用 Google 的文件选择器

我正在创建一个应用程序,要求用户从他们的云端硬盘中选择一个文件夹。我正在努力设置 Picker API。

按照本文档,我使用他们的“Hello World”脚本设置了我的项目,但是在更改了“devlopedKey”和“clientID”之后,我测试了代码以接收错误:

错误 401,invalid_client,没有注册的来源。

在四处搜索后,我发现了将客户端凭据中的 Authorized JavaScript origin 设置为http://localhost:8888 的建议。这样做后,我收到一个不同的错误:

错误 400,origin_mismatch

对不起,如果这是我的一个简单错误,任何帮助将不胜感激。

google-api google-apps-script

1
推荐指数
1
解决办法
3636
查看次数

Google Script - 获取特定列的最后一行

我正在寻找一种方法来查找特定列的最后一行(带有数据)。假设 A 列第 100 行的最后一个数据项,B 列第 50 行的最后一个数据项。

.getLastRow(); 将永远返回 100 给我。

我需要一种简单的方法来获得 50(这是 B 列中最后一个非空行的行号)。

我不能使用循环。这非常重要,因为有数千行,它只会花费太多时间。

我用谷歌搜索了很多,但所有的答案都涉及循环。

javascript google-sheets google-apps-script

1
推荐指数
1
解决办法
2万
查看次数

在谷歌应用程序脚本中将数据从一张工作表复制到另一张工作表并附加一行,这是一个小问题

确定我把它弄下来了,但就是做对了。有一个脚本设置为从一张纸中获取数据并将其放入另一张纸中,我已经这样做了,但是在复制时会留下空白,我无法弄清楚如何解决它。我确定在代码中,我打了问号的地方就是问题所在。

我试过把 i, last, last+1, 10, 12 但这些都不起作用,感觉我错过了一些小东西来解决这个问题。下面是代码,如果需要,可以查看工作表的链接(工作表仅供我学习,如果您愿意,可以提供一个基本示例)。

提前致谢,如果代码可以写得更好,请让我知道,因为我还在学习:)

function copyInfo() {
  var app = SpreadsheetApp;
  var copySheet = app.getActiveSpreadsheet().getSheetByName("Copy");
  for (var i = 2; i <12; i++) {   
  var getInfo = copySheet.getRange(2,2,i,2).getValues();
  //  get the info from range above - start at row 2 on column 2 (b), get number of rows i , number of columns = 2, b,c 
  var last = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Paste").getLastRow();
  var pasteSheet = app.getActiveSpreadsheet().getSheetByName("Paste");
//  Tell it where you want the info to go to …
Run Code Online (Sandbox Code Playgroud)

google-apps-script

1
推荐指数
1
解决办法
2万
查看次数

Hmac Signing in Google Apps Script, When Secret and Digest are base64 encoded

Given this code in nodejs:

const crypto = require('crypto');
const message = 'message to sign';
const secret = 'mysecret';
const signature = crypto.createHmac('sha256', secret).update(message).digest('hex');
console.log(signature);
Run Code Online (Sandbox Code Playgroud)

The output is 40d4c57eed56968de0f3a22e73ebf8abc6ab4c38bba95fd2c85dd4dc90bf36b9

With the help of the answers here, I have exactly replicated this behavior in Google Apps Script, with this function:

//conversion from byte array taken from: /sf/answers/1955342161/
function makeHmacSignature(macAlg, message, secret) {
  return Utilities.computeHmacSignature(macAlg, message, secret).reduce(function(str,chr){
    chr = (chr < 0 ? chr + 256 : chr).toString(16);
    return str + …
Run Code Online (Sandbox Code Playgroud)

javascript base64 hmac node.js google-apps-script

1
推荐指数
1
解决办法
2273
查看次数

在 Google 脚本中显示进度

我想向用户显示一个冗长脚本的进度。理想情况下,我想使用running script cancel dismiss运行 Google 脚本时出现的黄色吐司

我知道你可以抛出自定义错误,但如何将自定义消息抛出到这个黄色框。

或者另一种选择也可以。不是 msgbox,因为它会停止脚本。

javascript notifications google-sheets google-apps-script

1
推荐指数
1
解决办法
4565
查看次数