どばすぽからデータを持ってくるスクリプト
var id_sheet = SpreadsheetApp.openById('**********').getSheetByName('シート1'); //ID、URL保管用スプシのID
var pack = id_sheet.getRange('B4').getValue(); //パック名
var no = id_sheet.getRange('B5').getValue(); //カードパックの番号(暗黒のウェルサ時点で20)
function get_card_link() {
for(var classID = 0; classID <= 8; classID++){
var getUrl = 'https://shadowverse-portal.com/cards?clan%5B0%5D=' + classID + '&format=3&card_set%5B0%5D=100' + no + '&lang=ja'; //対象URL
var html = UrlFetchApp.fetch(getUrl).getContentText('UTF-8'); //htmlを文字列化
var card_name_list = Parser.data(html).from('<p class="el-card-visual-name">').to('</p>').iterate(); //カード名を取得
var card_id_list = Parser.data(html).from('data-src="https://shadowverse-portal.com/image/card/phase2/common/C/C_').to('.png').iterate(); //カードページのURLを取得
var spreadsheet = SpreadsheetApp.openById(id_sheet.getRange('B1').getValue()); //データを格納するスプシ
var sheet = spreadsheet.getSheetByName(classID);
var recordrow = 2;
for(var i = card_name_list.length-1; i >= 0; i--){
sheet.getRange("A" + recordrow).setValue(card_name_list[i]);
sheet.getRange("B" + recordrow).setValue('https://shadowverse-portal.com/card/' + card_id_list[i] + '?lang=ja');
switch(card_id_list[i].charAt(5)){
case '1':
sheet.getRange("C" + recordrow).setValue('フォロワー');
break;
case '3':
sheet.getRange("C" + recordrow).setValue('アミュレット');
break;
case '4':
sheet.getRange("C" + recordrow).setValue('スペル');
break;
}
var card = UrlFetchApp.fetch('https://shadowverse-portal.com/card/' + card_id_list[i] + '?lang=ja').getContentText('UTF-8');
var infos = Parser.data(card).from('<ul class="card-info-content">').to('</ul>').iterate();
for (var l = 0; l < infos.length; l++) {
var info = infos[l];
var data = Parser.data(info).from('<span>').to('</span>').iterate();
}
sheet.getRange("D" + recordrow).setValue(data[0]);
sheet.getRange("E" + recordrow).setValue(data[1]);
sheet.getRange("F" + recordrow).setValue(data[2]);
sheet.getRange("G" + recordrow).setValue(data[5]);
var skill = Parser.data(card).from('<p class="card-content-skill">').to('</p>').iterate();
var description= Parser.data(card).from('<p class="card-content-description">').to('</p>').iterate();
if (card_id_list[i].charAt(5) === '1'){ //idの6文字目が5=フォロワーの時
var atk = Parser.data(card).from('<p class="el-card-status is-atk">').to('</p>').iterate();
var life = Parser.data(card).from('<p class="el-card-status is-life">').to('</p>').iterate();
sheet.getRange("H" + recordrow).setValue(atk[0]);
sheet.getRange("I" + recordrow).setValue(life[0]);
sheet.getRange("J" + recordrow).setValue(skill[0]);
sheet.getRange("K" + recordrow).setValue(description[0]);
sheet.getRange("L" + recordrow).setValue(atk[1]);
sheet.getRange("M" + recordrow).setValue(life[1]);
sheet.getRange("N" + recordrow).setValue(skill[1]);
sheet.getRange("O" + recordrow).setValue(description[1]);
}else{ //そうでない時
sheet.getRange("H" + recordrow).setValue(''); //スペルとアミュレットは攻撃力と体力が必要無い
sheet.getRange("I" + recordrow).setValue('');
sheet.getRange("J" + recordrow).setValue(skill); //能力とフレーバーテキストも進化後が必要無い
sheet.getRange("K" + recordrow).setValue(description);
sheet.getRange("L" + recordrow).setValue('');
sheet.getRange("M" + recordrow).setValue('');
sheet.getRange("N" + recordrow).setValue('');
sheet.getRange("O" + recordrow).setValue('');
}
for (cost = 0; cost <=10; cost++){ //どばすぽのカード検索機能から無理矢理コストを抽出※コスト10以上は10扱いになるので注意
var searchUrl = 'https://shadowverse-portal.com/cards?clan[]=' + classID + '&card_set[]=100' + no + '&cost[]=' + cost + '&lang=ja'; //どばすぽカード検索URL
var search_result = UrlFetchApp.fetch(searchUrl).getContentText('UTF-8');
var search_name_list = Parser.data(search_result).from('<p class="el-card-visual-name">').to('</p>').iterate();
if (search_name_list.includes(card_name_list[i])){
sheet.getRange("P" + recordrow).setValue(cost);
break;
}
break;
}
recordrow++;
}
}
}
実際にページテンプレに入れるスクリプト
var id_sheet = SpreadsheetApp.openById('**********').getSheetByName('シート1'); //ID、URL保管用スプシのID
var pack = id_sheet.getRange('B4').getValue(); //パック名
var no = id_sheet.getRange('B5').getValue(); //パックNo
function page_generate() {
var classID = 0;
var spreadsheet = SpreadsheetApp.openById(id_sheet.getRange('B1').getValue()); //どばすぽから落としたデータの入ってるスプシ
var template_sheet = SpreadsheetApp.openById(id_sheet.getRange('B2').getValue()).getSheetByName('シート1'); //カードページテンプレを入れたスプシ
var cardpage_spreadsheet = SpreadsheetApp.openById(id_sheet.getRange('B3').getValue()); //出力するスプシ
while (classID < 9) {
var sheet = spreadsheet.getSheetByName(classID);
var cardpage_sheet = cardpage_spreadsheet.getSheetByName(classID);
var readrow = 2;
while (sheet.getRange("A" + readrow).getValue() != ''){
switch (sheet.getRange("C" + readrow).getValue()){
case 'フォロワー':
var template = template_sheet.getRange("A" + 1).getValue();
var name = sheet.getRange("A" + readrow).getValue().replace(/\r\n|\n|\r/g, '');
var type = sheet.getRange("D" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace('兵士', '[[兵士>タイプ:指揮官/兵士]]').replace('指揮官', '[[指揮官>タイプ:指揮官/兵士]]').replace('レヴィオン', '[[レヴィオン>タイプ:レヴィオン]]').replace('財宝', '[[財宝>タイプ:財宝]]').replace('土の印', '[[土の印>タイプ:土の印]]').replace('マナリア', '[[マナリア>タイプ:マナリア]]').replace('機械', '[[機械>タイプ:機械]]').replace('自然', '[[自然>タイプ:自然]]');
var class_name = sheet.getRange("E" + readrow).getValue().replace(/\r\n|\n|\r/g, '');
var reality = sheet.getRange("F" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace('レア', '');
var cv = sheet.getRange("G" + readrow).getValue().replace(/\r\n|\n|\r/g, '');
var atk = sheet.getRange("H" + readrow).getValue().toString().replace(/\r\n|\n|\r/g, '');
var life = sheet.getRange("I" + readrow).getValue().toString().replace(/\r\n|\n|\r/g, '');
var skill = sheet.getRange("J" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace(/<br>/g, "~~").replace(/ファンファーレ|ラストワード|進化時|攻撃時|守護|疾走|潜伏|必殺|ドレイン|覚醒|復讐|スペルブースト|カウントダウン|ネクロマンス|土の秘術|突進|交戦時|エンハンス|リアニメイト|葬送|共鳴|チョイス|アクセラレート|直接召喚|結晶|ユニオンンバースト|渇望|狂乱|融合|連携|操縦|奥義|解放奥義|公開/g, '\'\'[[$&]]\'\'');
var description = sheet.getRange("K" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace(/<br>/g, "\n");
var atk_evo = sheet.getRange("L" + readrow).getValue().toString().replace(/\r\n|\n|\r/g, '');
var life_evo = sheet.getRange("M" + readrow).getValue().toString().replace(/\r\n|\n|\r/g, '');
var skill_evo = sheet.getRange("N" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace(/<br>/g, "~~").replace(/ファンファーレ|ラストワード|進化時|攻撃時|守護|疾走|潜伏|必殺|ドレイン|覚醒|復讐|スペルブースト|カウントダウン|ネクロマンス|土の秘術|突進|交戦時|エンハンス|リアニメイト|葬送|共鳴|チョイス|アクセラレート|直接召喚|結晶|ユニオンンバースト|渇望|狂乱|融合|連携|操縦|奥義|解放奥義|公開/g, '\'\'[[$&]]\'\'');
var description_evo = sheet.getRange("O" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace(/<br>/g, "\n");
var cost = sheet.getRange("P" + readrow).getValue();
var new_card_page = template.replace('name', name).replace('type', type).replace(/class_name/g, class_name).replace(/reality/g, reality).replace('cv', cv).replace('atk', atk).replace('life', life).replace('skill', skill).replace('description', description).replace('atk_evo', atk_evo).replace('life_evo', life_evo).replace('skill_evo', skill_evo).replace('description_evo', description_evo).replace(/pack/g, pack).replace('no', no).replace('cost', cost);
cardpage_sheet.getRange("A" + readrow).setValue(name);
cardpage_sheet.getRange("B" + readrow).setValue(new_card_page);
break;
case 'スペル':
var template = template_sheet.getRange("B" + 1).getValue();
var name = sheet.getRange("A" + readrow).getValue().replace(/\r\n|\n|\r/g, '');
var type = sheet.getRange("D" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace('兵士', '[[兵士>タイプ:指揮官/兵士]]').replace('指揮官', '[[指揮官>タイプ:指揮官/兵士]]').replace('レヴィオン', '[[レヴィオン>タイプ:レヴィオン]]').replace('財宝', '[[財宝>タイプ:財宝]]').replace('土の印', '[[土の印>タイプ:土の印]]').replace('マナリア', '[[マナリア>タイプ:マナリア]]').replace('機械', '[[機械>タイプ:機械]]').replace('自然', '[[自然>タイプ:自然]]');
var class_name = sheet.getRange("E" + readrow).getValue().replace(/\r\n|\n|\r/g, '');
var reality = sheet.getRange("F" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace('レア', '');
var cv = sheet.getRange("G" + readrow).getValue().replace(/\r\n|\n|\r/g, '');
var skill = sheet.getRange("J" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace(/<br>/g, "~~").replace(/ファンファーレ|ラストワード|進化時|攻撃時|守護|疾走|潜伏|必殺|ドレイン|覚醒|復讐|スペルブースト|カウントダウン|ネクロマンス|土の秘術|突進|交戦時|エンハンス|リアニメイト|葬送|共鳴|チョイス|アクセラレート|直接召喚|結晶|ユニオンンバースト|渇望|狂乱|融合|連携|操縦|奥義|解放奥義|公開/g, '\'\'[[$&]]\'\'');
var description = sheet.getRange("K" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace(/<br>/g, "\n");
var cost = sheet.getRange("P" + readrow).getValue();
var new_card_page = template.replace('name', name).replace('type', type).replace(/class_name/g, class_name).replace(/reality/g, reality).replace('cv', cv).replace('skill', skill).replace('description', description).replace(/pack/g, pack).replace('no', no).replace('cost', cost);
cardpage_sheet.getRange("A" + readrow).setValue(name);
cardpage_sheet.getRange("B" + readrow).setValue(new_card_page);
break;
case 'アミュレット':
var template = template_sheet.getRange("C" + 1).getValue();
var name = sheet.getRange("A" + readrow).getValue().replace(/\r\n|\n|\r/g, '');
var type = sheet.getRange("D" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace('兵士', '[[兵士>タイプ:指揮官/兵士]]').replace('指揮官', '[[指揮官>タイプ:指揮官/兵士]]').replace('レヴィオン', '[[レヴィオン>タイプ:レヴィオン]]').replace('財宝', '[[財宝>タイプ:財宝]]').replace('土の印', '[[土の印>タイプ:土の印]]').replace('マナリア', '[[マナリア>タイプ:マナリア]]').replace('機械', '[[機械>タイプ:機械]]').replace('自然', '[[自然>タイプ:自然]]');
var class_name = sheet.getRange("E" + readrow).getValue().replace(/\r\n|\n|\r/g, '');
var reality = sheet.getRange("F" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace('レア', '');
var cv = sheet.getRange("G" + readrow).getValue().replace(/\r\n|\n|\r/g, '');
var skill = sheet.getRange("J" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace(/<br>/g, "~~").replace(/ファンファーレ|ラストワード|進化時|攻撃時|守護|疾走|潜伏|必殺|ドレイン|覚醒|復讐|スペルブースト|カウントダウン|ネクロマンス|土の秘術|突進|交戦時|エンハンス|リアニメイト|葬送|共鳴|チョイス|アクセラレート|直接召喚|結晶|ユニオンンバースト|渇望|狂乱|融合|連携|操縦|奥義|解放奥義|公開/g, '\'\'[[$&]]\'\'');
var description = sheet.getRange("K" + readrow).getValue().replace(/\r\n|\n|\r/g, '').replace(/<br>/g, "\n");
var cost = sheet.getRange("P" + readrow).getValue();
var new_card_page = template.replace('name', name).replace('type', type).replace(/class_name/g, class_name).replace(/reality/g, reality).replace('cv', cv).replace('skill', skill).replace('description', description).replace(/pack/g, pack).replace('no', no).replace('cost', cost);
cardpage_sheet.getRange("A" + readrow).setValue(name);
cardpage_sheet.getRange("B" + readrow).setValue(new_card_page);
break;
}
readrow++;
}
classID++;
}
}