我如何从 Rhino 为 V8 重写这段代码?
How do I rewrite this code for V8 from Rhino?
我习惯了GAS上的脚本。
因为我确实通过聊天管理出勤,并且 Google 使用 GAS 传播 sheet。
聊天工具是Chat work。
它适用于 Gas(Rhino)。
但它不工作 V8.
我尝试将第 19 行 for each (var obj in json){
重写为 for (var obj in json){
请告诉我哪里不好...
我应该重写哪个?
function recordTime(){
/*Sheet setting*/
var wsData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data"); //DataSheetSetting
var wsStaff = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("coworkers"); //CoworkersMasterSetting
/*ChatworkURLrequest*/
var params = {
headers : {"X-ChatWorkToken" : 'anynumber'},
method : "get"
};
var roomID = anynumber; //ROOMID
var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages?force=0"; //GetMessageFromGroupchat
try{
var respons = UrlFetchApp.fetch(url, params); //GetResponseFromChatworkAPIendpoint
var json = JSON.parse(respons.getContentText()); //Returnjson
for each(var obj in json){ //I understand that I should rewrite "for (var obj in json){
/*Get YMDhm and ID*/
var date = new Date(obj.send_time*1000);
var date_D = new Date(date.getFullYear(),date.getMonth(),date.getDate(),0,0,0);
var date_T = new Date(date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),0);
var date_TH = new Date(0,0,0,date.getHours(),date.getMinutes(),0);
/*dateToSn Setting*/
var MILLIS_DIFFERENCE = 9 * 60 * 60 * 1000;
var COEFFICIENT = 24 * 60 * 60 * 1000;
var DATES_OFFSET = 70 * 365 + 17 + 1 + 1;
function dateToSn(date){ //Date→Serial
return convertUt2Sn(date.getTime());
}
function convertUt2Sn(unixTimeMillis){ //UNIX→Serial
return (unixTimeMillis + MILLIS_DIFFERENCE) / COEFFICIENT + DATES_OFFSET;
}
/*findRow*/
function findRow(sheet,val,col){
var dat = sheet.getDataRange().getValues();
for(var i=1;i<dat.length;i++){
if(dat[i][col-1] === val){
return i+1;
}
}
return 0;
}
/*StaffID*/
var staffID = wsStaff.getRange(findRow(wsStaff,obj.account.account_id,1),2).getValue();
var dataRow=findRow(wsData,dateToSn(date_D)+staffID.toString(),1);
if(obj.body.match(/出勤/)){
if(!dataRow){
wsData.appendRow(
["=INDIRECT(\"RC[1]\",FALSE) & INDIRECT(\"RC[2]\",FALSE)",date_D,
"=VLOOKUP(" + obj.account.account_id + ",'coworkers'!A:B,2,FALSE)","=VLOOKUP(" + obj.account.account_id + ",'coworkers'!A:E,4,FALSE)","出勤",date_T
]);
}
}else if(obj.body.match(/外出/) || obj.body.match(/直行/)){
if(dataRow){
var rng = wsData.getRange(dataRow,8);
if(!rng.getValue()){
rng.setValue(date_T);
}
}
}else if(obj.body.match(/帰社/) || obj.body.match(/直帰/)){
if(dataRow){
var rng = wsData.getRange(dataRow,9);
if(!rng.getValue()){
rng.setValue(date_T);
}
}
}else if (obj.body.match(/中抜け/)){
if(dataRow){
var rng = wsData.getRange(dataRow,10);
if(!rng.getValue()){
rng.setValue(date_T);
}
}
}else if (obj.body.match(/戻り/)){
if(dataRow){
var rng = wsData.getRange(dataRow,11);
if(!rng.getValue()){
rng.setValue(date_T);
}
}
}else if(obj.body.match(/退勤/)){
if(dataRow){
var rng = wsData.getRange(dataRow,7);
if(!rng.getValue()){
rng.setValue(date_T);
}
}
}
}
}catch(e){
Logger.log('Error');
Logger.log(e.message);
}
}
简而言之:
for each (var obj in json) {
do_something_with(obj);
}
变成
for (var obj of json) {
do_something_with(obj);
}
请注意,in
更改为 of
,这使得 for
循环遍历值而不是键。相应地,也可以使用传统的for-in
循环,手动使用key获取值:
for (var obj_key in json) {
var obj = json[obj_key];
do_something_with(obj);
}
您也可以使用 let
而不是 var
来获取块范围的变量,这通常使用起来更直观,但这是一个无关的更改,如果您只是想要东西,则不需要上班。
Google 应用程序脚本将运行时引擎从 Rhino 切换到 V8。这也让我感到惊讶,并使我的一堆代码变得乏味,包括日期和年份操作。
年份的处理方式不同。 getYear() 不再按预期工作。
您可以切换回旧版 Rhino。参见 Enabling the Rhino Runtime
https://developers.google.com/apps-script/guides/v8-runtime
上有关于 V8 的信息
Google 已发布 incompatibilities and other differences 列表,其中包含有关解决方法的良好文档。
完全 link 用于脚本迁移:https://developers.google.com/apps-script/guides/v8-runtime/migration
幸运的是这不是我期待的戏剧。不过,如果事先得到提醒就好了。
我习惯了GAS上的脚本。 因为我确实通过聊天管理出勤,并且 Google 使用 GAS 传播 sheet。 聊天工具是Chat work。 它适用于 Gas(Rhino)。 但它不工作 V8.
我尝试将第 19 行 for each (var obj in json){
重写为 for (var obj in json){
请告诉我哪里不好... 我应该重写哪个?
function recordTime(){
/*Sheet setting*/
var wsData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data"); //DataSheetSetting
var wsStaff = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("coworkers"); //CoworkersMasterSetting
/*ChatworkURLrequest*/
var params = {
headers : {"X-ChatWorkToken" : 'anynumber'},
method : "get"
};
var roomID = anynumber; //ROOMID
var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages?force=0"; //GetMessageFromGroupchat
try{
var respons = UrlFetchApp.fetch(url, params); //GetResponseFromChatworkAPIendpoint
var json = JSON.parse(respons.getContentText()); //Returnjson
for each(var obj in json){ //I understand that I should rewrite "for (var obj in json){
/*Get YMDhm and ID*/
var date = new Date(obj.send_time*1000);
var date_D = new Date(date.getFullYear(),date.getMonth(),date.getDate(),0,0,0);
var date_T = new Date(date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),0);
var date_TH = new Date(0,0,0,date.getHours(),date.getMinutes(),0);
/*dateToSn Setting*/
var MILLIS_DIFFERENCE = 9 * 60 * 60 * 1000;
var COEFFICIENT = 24 * 60 * 60 * 1000;
var DATES_OFFSET = 70 * 365 + 17 + 1 + 1;
function dateToSn(date){ //Date→Serial
return convertUt2Sn(date.getTime());
}
function convertUt2Sn(unixTimeMillis){ //UNIX→Serial
return (unixTimeMillis + MILLIS_DIFFERENCE) / COEFFICIENT + DATES_OFFSET;
}
/*findRow*/
function findRow(sheet,val,col){
var dat = sheet.getDataRange().getValues();
for(var i=1;i<dat.length;i++){
if(dat[i][col-1] === val){
return i+1;
}
}
return 0;
}
/*StaffID*/
var staffID = wsStaff.getRange(findRow(wsStaff,obj.account.account_id,1),2).getValue();
var dataRow=findRow(wsData,dateToSn(date_D)+staffID.toString(),1);
if(obj.body.match(/出勤/)){
if(!dataRow){
wsData.appendRow(
["=INDIRECT(\"RC[1]\",FALSE) & INDIRECT(\"RC[2]\",FALSE)",date_D,
"=VLOOKUP(" + obj.account.account_id + ",'coworkers'!A:B,2,FALSE)","=VLOOKUP(" + obj.account.account_id + ",'coworkers'!A:E,4,FALSE)","出勤",date_T
]);
}
}else if(obj.body.match(/外出/) || obj.body.match(/直行/)){
if(dataRow){
var rng = wsData.getRange(dataRow,8);
if(!rng.getValue()){
rng.setValue(date_T);
}
}
}else if(obj.body.match(/帰社/) || obj.body.match(/直帰/)){
if(dataRow){
var rng = wsData.getRange(dataRow,9);
if(!rng.getValue()){
rng.setValue(date_T);
}
}
}else if (obj.body.match(/中抜け/)){
if(dataRow){
var rng = wsData.getRange(dataRow,10);
if(!rng.getValue()){
rng.setValue(date_T);
}
}
}else if (obj.body.match(/戻り/)){
if(dataRow){
var rng = wsData.getRange(dataRow,11);
if(!rng.getValue()){
rng.setValue(date_T);
}
}
}else if(obj.body.match(/退勤/)){
if(dataRow){
var rng = wsData.getRange(dataRow,7);
if(!rng.getValue()){
rng.setValue(date_T);
}
}
}
}
}catch(e){
Logger.log('Error');
Logger.log(e.message);
}
}
简而言之:
for each (var obj in json) {
do_something_with(obj);
}
变成
for (var obj of json) {
do_something_with(obj);
}
请注意,in
更改为 of
,这使得 for
循环遍历值而不是键。相应地,也可以使用传统的for-in
循环,手动使用key获取值:
for (var obj_key in json) {
var obj = json[obj_key];
do_something_with(obj);
}
您也可以使用 let
而不是 var
来获取块范围的变量,这通常使用起来更直观,但这是一个无关的更改,如果您只是想要东西,则不需要上班。
Google 应用程序脚本将运行时引擎从 Rhino 切换到 V8。这也让我感到惊讶,并使我的一堆代码变得乏味,包括日期和年份操作。
年份的处理方式不同。 getYear() 不再按预期工作。
您可以切换回旧版 Rhino。参见 Enabling the Rhino Runtime
https://developers.google.com/apps-script/guides/v8-runtime
上有关于 V8 的信息Google 已发布 incompatibilities and other differences 列表,其中包含有关解决方法的良好文档。
完全 link 用于脚本迁移:https://developers.google.com/apps-script/guides/v8-runtime/migration
幸运的是这不是我期待的戏剧。不过,如果事先得到提醒就好了。