"Requested entity was not found." - Apps 脚本执行 API 错误
"Requested entity was not found." - Apps Script Execution API error
我们有一个 Apps 脚本安装在五个 G Suite 帐户中。我正在从部署在 Google App Engine 中的 Java 代码调用应用程序脚本。我已将五个刷新令牌存储在一个属性文件中,并在调用 Apps 脚本之前以循环方式将它们设置在 GoogleCredential 中。当我尝试调用 Apps 脚本 Requested entity was not found.
时,返回了一个错误。但是,当我创建一个简单的 java 程序来调用 Apps 脚本时,相同的刷新令牌和客户端密码可以正常工作。
@Service
public class GoogleAppsScriptServiceImpl {
private String[] scriptIds;
private String[] refreshTokens;
private GoogleCerdential credential;
public void executeAppsScript() {
List<Object> params = new ArrayList<>();
params.add(googleDocFileId);
ExecutionRequest request = new ExecutionRequest()
.setFunction(APPS_SCRIPT_FUNCTION_NAME)
.setParameters(params);
int index = new Random().nextInt(numOfUsers);
Script scriptService = getScriptService(refreshTokens[index]);
String scriptId = scriptIds[index];
Operation operation = scriptService.scripts()
.run(scriptId, request)
.setQuotaUser(UUID.randomUUID().toString())
.execute();
}
private Script getScriptService(String refreshToken) {
credential.setRefreshToken(refreshToken);
return new Script.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(APPLICATION_NAME)
.build();
}
@PostConstruct
private void createGoogleCredential() throws Exception {
jsonFactory = JacksonFactory.getDefaultInstance();
httpTransport = GoogleNetHttpTransport.newTrustedTransport();
credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setClientSecrets(clientId, clientSecret)
.build();
refreshTokens = commaDelimitedListToStringArray(refreshTokensProp);
numOfUsers = refreshTokens.length;
scriptIds = commaDelimitedListToStringArray(scriptsIdsProp);
}
}
您正在将执行 API 部署到独立脚本类型或 container-bound 脚本类型的项目。并且您使用 API 调用项目中的函数。在这种情况下,出现Requested entity was not found.
的错误。如果我的理解是正确的,我也遇到过同样的情况。那么确认以下几点如何?
- 使用保存按钮,再次保存正在部署 API 可执行文件的项目。
- 这对我来说非常重要。
- 将项目另存为新版本,并重新部署API。
- 是否从使用 Apps 脚本 API 的项目中检索客户端 ID 和客户端密码。
- 是否从这些客户端 ID 和客户端密码中检索访问令牌。
- 范围是否包括
https://www.googleapis.com/auth/drive
、https://www.googleapis.com/auth/drive.scripts
和https://www.googleapis.com/auth/script.external_request
。
- 是否启用执行API。
如果想简单的使用curl命令进行测试,也可以使用下面的命令。
curl -X POST -L \
-H "Authorization: Bearer ### access token ###" \
-H "Content-Type: application/json" \
-d "{function: '### function name ###',devMode: true}" \
"https://script.googleapis.com/v1/scripts/### script ID ###:run"
确认以上几点后,请重试。如果这些对你没有用,我很抱歉。或者如果我误解了你的问题,我真的很抱歉。
问题不在于 Apps 脚本或 App Engine 项目的配置。我在 @PostConstruct
方法中创建了一个 GoogleCredential
对象,并在调用 Apps 脚本之前从 pre-generated 令牌列表中设置了刷新令牌 (credential.setRefreshToken()
)。即使我已经为同一组客户端 ID 和客户端密码创建了刷新令牌,我还是收到了错误。因此,我正在创建多个 GoogleCredential
个对象作为刷新令牌的数量,而不是 re-use 个跨多个刷新令牌的凭据对象。
private GoogleCredential[] credentials;
@PostConstruct
private void createGoogleCredential() throws Exception {
jsonFactory = JacksonFactory.getDefaultInstance();
httpTransport = GoogleNetHttpTransport.newTrustedTransport();
String[] refreshTokens = commaDelimitedListToStringArray(refreshTokensProp);
numOfUsers = refreshTokens.length;
credentials = new GoogleCredential[numOfUsers];
for (int i=0; i<numOfUsers; i++) {
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setClientSecrets(clientId, clientSecret)
.build();
credential.setRefreshToken(refreshTokens[i]);
credentials[i] = credential;
}
scriptIds = commaDelimitedListToStringArray(scriptsIdsProp);
}
我们有一个 Apps 脚本安装在五个 G Suite 帐户中。我正在从部署在 Google App Engine 中的 Java 代码调用应用程序脚本。我已将五个刷新令牌存储在一个属性文件中,并在调用 Apps 脚本之前以循环方式将它们设置在 GoogleCredential 中。当我尝试调用 Apps 脚本 Requested entity was not found.
时,返回了一个错误。但是,当我创建一个简单的 java 程序来调用 Apps 脚本时,相同的刷新令牌和客户端密码可以正常工作。
@Service
public class GoogleAppsScriptServiceImpl {
private String[] scriptIds;
private String[] refreshTokens;
private GoogleCerdential credential;
public void executeAppsScript() {
List<Object> params = new ArrayList<>();
params.add(googleDocFileId);
ExecutionRequest request = new ExecutionRequest()
.setFunction(APPS_SCRIPT_FUNCTION_NAME)
.setParameters(params);
int index = new Random().nextInt(numOfUsers);
Script scriptService = getScriptService(refreshTokens[index]);
String scriptId = scriptIds[index];
Operation operation = scriptService.scripts()
.run(scriptId, request)
.setQuotaUser(UUID.randomUUID().toString())
.execute();
}
private Script getScriptService(String refreshToken) {
credential.setRefreshToken(refreshToken);
return new Script.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(APPLICATION_NAME)
.build();
}
@PostConstruct
private void createGoogleCredential() throws Exception {
jsonFactory = JacksonFactory.getDefaultInstance();
httpTransport = GoogleNetHttpTransport.newTrustedTransport();
credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setClientSecrets(clientId, clientSecret)
.build();
refreshTokens = commaDelimitedListToStringArray(refreshTokensProp);
numOfUsers = refreshTokens.length;
scriptIds = commaDelimitedListToStringArray(scriptsIdsProp);
}
}
您正在将执行 API 部署到独立脚本类型或 container-bound 脚本类型的项目。并且您使用 API 调用项目中的函数。在这种情况下,出现Requested entity was not found.
的错误。如果我的理解是正确的,我也遇到过同样的情况。那么确认以下几点如何?
- 使用保存按钮,再次保存正在部署 API 可执行文件的项目。
- 这对我来说非常重要。
- 将项目另存为新版本,并重新部署API。
- 是否从使用 Apps 脚本 API 的项目中检索客户端 ID 和客户端密码。
- 是否从这些客户端 ID 和客户端密码中检索访问令牌。
- 范围是否包括
https://www.googleapis.com/auth/drive
、https://www.googleapis.com/auth/drive.scripts
和https://www.googleapis.com/auth/script.external_request
。 - 是否启用执行API。
如果想简单的使用curl命令进行测试,也可以使用下面的命令。
curl -X POST -L \
-H "Authorization: Bearer ### access token ###" \
-H "Content-Type: application/json" \
-d "{function: '### function name ###',devMode: true}" \
"https://script.googleapis.com/v1/scripts/### script ID ###:run"
确认以上几点后,请重试。如果这些对你没有用,我很抱歉。或者如果我误解了你的问题,我真的很抱歉。
问题不在于 Apps 脚本或 App Engine 项目的配置。我在 @PostConstruct
方法中创建了一个 GoogleCredential
对象,并在调用 Apps 脚本之前从 pre-generated 令牌列表中设置了刷新令牌 (credential.setRefreshToken()
)。即使我已经为同一组客户端 ID 和客户端密码创建了刷新令牌,我还是收到了错误。因此,我正在创建多个 GoogleCredential
个对象作为刷新令牌的数量,而不是 re-use 个跨多个刷新令牌的凭据对象。
private GoogleCredential[] credentials;
@PostConstruct
private void createGoogleCredential() throws Exception {
jsonFactory = JacksonFactory.getDefaultInstance();
httpTransport = GoogleNetHttpTransport.newTrustedTransport();
String[] refreshTokens = commaDelimitedListToStringArray(refreshTokensProp);
numOfUsers = refreshTokens.length;
credentials = new GoogleCredential[numOfUsers];
for (int i=0; i<numOfUsers; i++) {
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setClientSecrets(clientId, clientSecret)
.build();
credential.setRefreshToken(refreshTokens[i]);
credentials[i] = credential;
}
scriptIds = commaDelimitedListToStringArray(scriptsIdsProp);
}