我的代码不再有效,但我没有更改它
my code doesn't work anymore but i haven't changed it
几个月前我创建了一个脚本来为我的学生发布作业 google classroom.the 代码如下
function createTrigger() {
// Trigger every day at 9
ScriptApp.newTrigger('pubblicavideo')
.timeBased()
.atHour(9)
.everyDays(1) // Frequency is required if you are using atHour() or nearMinute()
.create();
}
function onOpen() {
//aggiunge il bottone autotrigger con run e stop all'apertura del documento spreadsheet
var ui = SpreadsheetApp.getUi();
ui.createMenu("Auto Trigger")
.addItem("Run","runAuto")
.addItem("Stop","deleteTrigger")
.addToUi();
}
function runAuto() {
// resets the loop counter if it's not 0
refreshUserProps();
// clear out the sheet
clearData();
// create trigger to run program automatically
createTrigger();
}
function refreshUserProps() {
var userProperties = PropertiesService.getUserProperties();
userProperties.setProperty('loopCounter', 0);
userProperties.setProperty('contarighe', 1);
}
function deleteTrigger() {
// Loop over all triggers and delete them
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
ScriptApp.deleteTrigger(allTriggers[i]);
}
}
function pubblica(k)
{
var corso = Classroom.Courses.get(XXXXXXXXXXXXXX);
var foglio = SpreadsheetApp.getActive();
var linkini = foglio.getRange("C709:C3014");
var titolini = foglio.getRange("B709:B3014");
var autorini = foglio.getRange("A709:A3014");
var cell = linkini.getCell(k, 1);
var cella = titolini.getCell(k, 1);
var cello = autorini.getCell(k, 1);
var link = cell.getValue();
var titolo = cella.getValue();
var autore = cello.getValue();
var courseWork = {
'title': titolo,
'description': autore,
'materials': [
{'link': { "url": link}}
],
'workType': 'ASSIGNMENT',
'state': 'PUBLISHED',
}
Classroom.Courses.CourseWork.create(courseWork,XXXXXXXXXXXXXX);
}
function clearData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Data');
// clear out the matches and output sheets
var lastRow = sheet.getLastRow();
if (lastRow > 1) {
sheet.getRange(2,1,lastRow-1,1).clearContent();
}
}
function pubblicavideo()
{
var pezzialgiorno = 3; //numero di pezzi da pubblicare ogni giorno
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Data');
var userProperties = PropertiesService.getUserProperties();
var loopCounter = Number(userProperties.getProperty('loopCounter'));
var contarighe = Number(userProperties.getProperty('contarighe'));
// put some limit on the number of loops
// could be based on a calculation or user input
// using a static number in this example
var limit = 2301;
// if loop counter < limit number, run the repeatable action
if (loopCounter < limit) {
// see what the counter value is at the start of the loop
Logger.log(loopCounter);
// do stuff
for (var i=0; i<pezzialgiorno; i++)
{
pubblica(contarighe);
contarighe++;
}
// increment the properties service counter for the loop
loopCounter +=1;
userProperties.setProperty('loopCounter', loopCounter);
userProperties.setProperty('contarighe', contarighe);
// see what the counter value is at the end of the loop
Logger.log(loopCounter);
Logger.log(contarighe);
}
// if the loop counter is no longer smaller than the limit number
// run this finishing code instead of the repeatable action block
else {
// Log message to confirm loop is finished
sheet.getRange(sheet.getLastRow()+1,1).setValue("Finished");
Logger.log("Finished");
// delete trigger because we've reached the end of the loop
// this will end the program
deleteTrigger();
}
}
我放 XXXXXXXXXXX 的地方就是课程 ID。
该脚本附在一个电子表格上,该电子表格有 3 列,标题、作者和 youtube link,作业是这些视频之一,作为 link 附在 material 上。该脚本应每天在 9:00 a.m 发布。 3 个不同的 3 个 YouTube 视频 material 运行 在电子表格中的列表
当我尝试执行名为 pubblicavideo 的函数时,它说
GoogleJsonResponseException: Chiamata API a classroom.courses.courseWork.create non riuscita con errore: 'course_work.description' (TYPE_STRING), 883 (riga 69, file "Codice") 值无效
我觉得英文翻译是这样的
GoogleJsonResponseException:API 对 classroom.courses.courseWork.create 的调用无效,出现错误:'course_work.description' (TYPE_STRING) 处的值无效,883(第 69 行,文件“代码")
这个脚本在 8 月 13 日之前一直运行良好。我不知道 google 课堂脚本是否有任何变化。
你们中有人知道如何让它再次工作吗?
答案:
问题似乎是在某些时候,从 autorini.getCell(k, 1).getValue()
获得的值的类型不是导致错误的字符串。
解决步骤:
在pubblicavideo()
中,函数pubblica()
在循环内被调用,并传递了变量contarighe
。对于 pubblica
的每个 运行,此值被放入 k
。
这些是有问题的行:
var autorini = foglio.getRange("A709:A3014");
var cello = autorini.getCell(k, 1);
var autore = cello.getValue();
在向 Classroom.Courses.CourseWork.create()
发出请求之前,您需要检查 autore
的值。
As per the documentation 在 CourseWork
资源上,description
的值应该是 String
.
类型
创建课程作业对象时:
var courseWork = {
'title': titolo,
'description': autore,
'materials': [
{'link': { "url": link}}
],
'workType': 'ASSIGNMENT',
'state': 'PUBLISHED',
}
autore
的值必须反映这一点。确保在循环中的任何一点你的代码停止,你的 sheet 值都是字符串类型,并且被正确检索。
参考文献:
几个月前我创建了一个脚本来为我的学生发布作业 google classroom.the 代码如下
function createTrigger() {
// Trigger every day at 9
ScriptApp.newTrigger('pubblicavideo')
.timeBased()
.atHour(9)
.everyDays(1) // Frequency is required if you are using atHour() or nearMinute()
.create();
}
function onOpen() {
//aggiunge il bottone autotrigger con run e stop all'apertura del documento spreadsheet
var ui = SpreadsheetApp.getUi();
ui.createMenu("Auto Trigger")
.addItem("Run","runAuto")
.addItem("Stop","deleteTrigger")
.addToUi();
}
function runAuto() {
// resets the loop counter if it's not 0
refreshUserProps();
// clear out the sheet
clearData();
// create trigger to run program automatically
createTrigger();
}
function refreshUserProps() {
var userProperties = PropertiesService.getUserProperties();
userProperties.setProperty('loopCounter', 0);
userProperties.setProperty('contarighe', 1);
}
function deleteTrigger() {
// Loop over all triggers and delete them
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
ScriptApp.deleteTrigger(allTriggers[i]);
}
}
function pubblica(k)
{
var corso = Classroom.Courses.get(XXXXXXXXXXXXXX);
var foglio = SpreadsheetApp.getActive();
var linkini = foglio.getRange("C709:C3014");
var titolini = foglio.getRange("B709:B3014");
var autorini = foglio.getRange("A709:A3014");
var cell = linkini.getCell(k, 1);
var cella = titolini.getCell(k, 1);
var cello = autorini.getCell(k, 1);
var link = cell.getValue();
var titolo = cella.getValue();
var autore = cello.getValue();
var courseWork = {
'title': titolo,
'description': autore,
'materials': [
{'link': { "url": link}}
],
'workType': 'ASSIGNMENT',
'state': 'PUBLISHED',
}
Classroom.Courses.CourseWork.create(courseWork,XXXXXXXXXXXXXX);
}
function clearData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Data');
// clear out the matches and output sheets
var lastRow = sheet.getLastRow();
if (lastRow > 1) {
sheet.getRange(2,1,lastRow-1,1).clearContent();
}
}
function pubblicavideo()
{
var pezzialgiorno = 3; //numero di pezzi da pubblicare ogni giorno
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Data');
var userProperties = PropertiesService.getUserProperties();
var loopCounter = Number(userProperties.getProperty('loopCounter'));
var contarighe = Number(userProperties.getProperty('contarighe'));
// put some limit on the number of loops
// could be based on a calculation or user input
// using a static number in this example
var limit = 2301;
// if loop counter < limit number, run the repeatable action
if (loopCounter < limit) {
// see what the counter value is at the start of the loop
Logger.log(loopCounter);
// do stuff
for (var i=0; i<pezzialgiorno; i++)
{
pubblica(contarighe);
contarighe++;
}
// increment the properties service counter for the loop
loopCounter +=1;
userProperties.setProperty('loopCounter', loopCounter);
userProperties.setProperty('contarighe', contarighe);
// see what the counter value is at the end of the loop
Logger.log(loopCounter);
Logger.log(contarighe);
}
// if the loop counter is no longer smaller than the limit number
// run this finishing code instead of the repeatable action block
else {
// Log message to confirm loop is finished
sheet.getRange(sheet.getLastRow()+1,1).setValue("Finished");
Logger.log("Finished");
// delete trigger because we've reached the end of the loop
// this will end the program
deleteTrigger();
}
}
我放 XXXXXXXXXXX 的地方就是课程 ID。 该脚本附在一个电子表格上,该电子表格有 3 列,标题、作者和 youtube link,作业是这些视频之一,作为 link 附在 material 上。该脚本应每天在 9:00 a.m 发布。 3 个不同的 3 个 YouTube 视频 material 运行 在电子表格中的列表
当我尝试执行名为 pubblicavideo 的函数时,它说
GoogleJsonResponseException: Chiamata API a classroom.courses.courseWork.create non riuscita con errore: 'course_work.description' (TYPE_STRING), 883 (riga 69, file "Codice") 值无效
我觉得英文翻译是这样的
GoogleJsonResponseException:API 对 classroom.courses.courseWork.create 的调用无效,出现错误:'course_work.description' (TYPE_STRING) 处的值无效,883(第 69 行,文件“代码")
这个脚本在 8 月 13 日之前一直运行良好。我不知道 google 课堂脚本是否有任何变化。
你们中有人知道如何让它再次工作吗?
答案:
问题似乎是在某些时候,从 autorini.getCell(k, 1).getValue()
获得的值的类型不是导致错误的字符串。
解决步骤:
在pubblicavideo()
中,函数pubblica()
在循环内被调用,并传递了变量contarighe
。对于 pubblica
的每个 运行,此值被放入 k
。
这些是有问题的行:
var autorini = foglio.getRange("A709:A3014");
var cello = autorini.getCell(k, 1);
var autore = cello.getValue();
在向 Classroom.Courses.CourseWork.create()
发出请求之前,您需要检查 autore
的值。
As per the documentation 在 CourseWork
资源上,description
的值应该是 String
.
创建课程作业对象时:
var courseWork = {
'title': titolo,
'description': autore,
'materials': [
{'link': { "url": link}}
],
'workType': 'ASSIGNMENT',
'state': 'PUBLISHED',
}
autore
的值必须反映这一点。确保在循环中的任何一点你的代码停止,你的 sheet 值都是字符串类型,并且被正确检索。