質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

1631閲覧

ループの進め方を変えたい

Kodanosuke

総合スコア42

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2019/03/24 13:59

前提・実現したいこと

trelloのカードからとったshortURLをcardsshortURLに、スプレッドシートからとったshortURLをsheetshortURLという配列に入れています。スプレッドシートの方に入っているshortURLはtrelloのものを転記しただけなので順番と内容は同じです
trelloに新しいカードを追加した際に、追加した順番通りにスプレッドシートの方に転記したいです。最後の方でcardsshortURLとsheetshortURLが一致するかfor文内で確認し、一致しない場合はその場所で行を1行入れたいです。どのようにしたら良いのでしょうか。

発生している問題・エラーメッセージ

特になし

該当のソースコード

google

1function createCards(){ 2 3 //-----追加するカードの内容をtrelloから取得する 4 5 const trelloKey = "XXXXXXXXX";//keyを入力してください 6 const trelloToken = "XXXXXXXXX";//tokenを入力してください 7 const userName = "kodanosuke";//user nameを入力してください 8 const boardID = 'XXXXXXXXXXXXX' 9 10 /* //テンプレートのリストIDと名前の一覧 11 var list = [listID1,listID2,listID3,listID4,listID5,] 12 var prelist_name = [listNAME1,listNAME2,listNAME3,listNAME4,listNAME5,] 13 var listNum = list.length;*/ 14 15 //---torelloのカード一覧を取得し、必要な情報だけ抜き出す 16 var cardsshortURL = []; 17 var count = 0 18 19 for(var j = 0;j < listNum;j++){ 20 var url = "https://trello.com/1/lists/" + list[j] + "/cards?key=" + trelloKey + "&token=" + trelloToken; 21 var res = UrlFetchApp.fetch(url, {'method':'get'}); 22 var card = JSON.parse(res.getContentText()); 23 var cardNum = card.length 24 var list_name = prelist_name[j] 25 26 27 28 //必要なデータのKeyを指定して値を取得する 29 for(var i = 0;i < cardNum;i++){ 30 31 var name = card[i]['name'] 32 var shortURL = card[i]['shortUrl'] 33 34 //取得したここのデータをまとめて、ひとつのカード情報としてまとめる 35 count = count + 1 36 //Logger.log(count) 37 var card1 = [shortURL]; 38 39 cardsshortURL.push(card1) 40 //Logger.log(cards) 41 42 } 43 } 44 var cardsNum = cardsshortURL.length 45 //Logger.log(cards) 46 47 48 //---既存カード情報をスプレッドシートから取得する 49 var sheetsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('memo') 50 var order = sheetsheet.getRange(2, 1, sheetsheet.getLastRow()-1).getValues()//カードの順番 51 var stats = sheetsheet.getRange(2, 2, sheetsheet.getLastRow()-1).getValues()//カードの作成状況 52 var listname = sheetsheet.getRange(2, 3, sheetsheet.getLastRow()-1).getValues()//リスト名 53 var sheetshortURL = sheetsheet.getRange(2, 7, sheetsheet.getLastRow()-1).getValues()//shorturl 54 55 const ar1 = cardsshortURL; 56const ar2 = sheetshortURL; 57 58var res = ar1.filter(function(e){return ar2.filter(function(f){return e.toString() == f.toString()}).length == 0}); 59 if(res.length > 0){ 60 var count = 1 61 for(var i=0;i<cardsshortURL.length;i++){ 62 63 if(sheetshortURL[i+count] != cardsshortURL[i]){ 64 count = count+1 65 Logger.log(i) 66 sheetsheet.insertRowAfter(count + 1) 67 break 68 } 69 70 } 71 } 72 Logger.log(res) 73 //sheetsheet.getRange(1, 13, 48, 3).setValues(cards) 74 75 76 } 77

試したこと

iで順番を指定したり、countで指定したりしましたが、2行目に行が挿入されるだけになってしまいます。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  • trelloやってないので、検証してない
  • trelloからは正しくとれている前提
  • 要件的に「追加した順番通りにスプレッドシートの方に転記したい」の意味が曖昧だったので2パターン書いた(似たようなことを2ブロックでやっているのでちゃんと見ないと使いものにならない)
  • 「cardsshortURLとsheetshortURLが一致するかfor文内で確認し、一致しない場合はその場所で行を1行入れたいです」について

insertRowAfterしても空の行が入るだけで意味がない。また、cardsshortとsheetshortが連動していて、例えば「1,11,2,3」と「1,2,3」とあるときに、「11」を2番目に入れたい、という意図だと考えると、比較なんかせずとも、cardsshortを上書きするだけで済む話。

  • 全般的にコードからやりたいこと(仕様)が見えてこない。状態をもちすぎてて読解できない。これはもう業務委託するレベル。これ以上teratailで回答を得るのは無理

javascript

1function createCards(){ 2 3 //-----追加するカードの内容をtrelloから取得する 4 const trelloKey = "XXXXXXXXX";//keyを入力してください 5 const trelloToken = "XXXXXXXXX";//tokenを入力してください 6 const userName = "kodanosuke";//user nameを入力してください 7 const boardID = 'XXXXXXXXXXXXX'; 8 9 /* //テンプレートのリストIDと名前の一覧 10 var list = [listID1,listID2,listID3,listID4,listID5,] 11 var prelist_name = [listNAME1,listNAME2,listNAME3,listNAME4,listNAME5,] 12 var listNum = list.length;*/ 13 14 //---torelloのカード一覧を取得し、必要な情報だけ抜き出す 15 var cardsshortURL = []; 16 var count = 0; 17 18 for(var j = 0;j < listNum;j++){ 19 var url = "https://trello.com/1/lists/" + list[j] + "/cards?key=" + trelloKey + "&token=" + trelloToken; 20 var res = UrlFetchApp.fetch(url, {'method':'get'}); 21 var card = JSON.parse(res.getContentText()); 22 var cardNum = card.length; 23 var list_name = prelist_name[j]; 24 25 //必要なデータのKeyを指定して値を取得する 26 for(var i = 0;i < cardNum;i++){ 27 var name = card[i]['name']; 28 var shortURL = card[i]['shortUrl']; 29 //取得したここのデータをまとめて、ひとつのカード情報としてまとめる 30 count = count + 1; 31 //Logger.log(count) 32 //var card1 = [shortURL]; 33 cardsshortURL.push([shortURL]); 34 //Logger.log(cards) 35 } 36 } 37 var cardsNum = cardsshortURL.length; 38 //Logger.log(cards) 39 40 41 //---既存カード情報をスプレッドシートから取得する 42 var sheetsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('memo'); 43 var order = sheetsheet.getRange(2, 1, sheetsheet.getLastRow()-1).getValues();//カードの順番 44 var stats = sheetsheet.getRange(2, 2, sheetsheet.getLastRow()-1).getValues();//カードの作成状況 45 var listname = sheetsheet.getRange(2, 3, sheetsheet.getLastRow()-1).getValues();//リスト名 46 var sheetshortURL = sheetsheet.getRange(2, 7, sheetsheet.getLastRow()-1).getValues();//shorturl 47 48 const ar1 = cardsshortURL; 49 const ar2 = sheetshortURL; 50 51 //末尾に、登場した順で、追加する場合 52 var added = ar1.filter(function(e){return ar2.filter(function(f){return e[0].toString() === f[0].toString()}).length === 0}); 53 added.forEach(function(e) { 54 sheetshortURL.push(e); 55 }); 56 sheetsheet.getRange(2, 7, added.length).setValues(added); 57 //末尾に、登場した順で、追加する場合 58 59 //登場した順で、間に挿入する場合] 60 // for(var idx = 0,pos = 0; idx < cardsshortURL.length; idx++,pos++) { 61 // if(cardsshortURL[idx][0] === sheetsshortURL[pos][0]) {continue;} 62 // sheetsheet.insertRowAfter(pos + 1, 1); 63 // sheet.getRange(2,pos + 2).setValue(cardsshortURL[idx][0]); 64 // pos++; 65 // } 66 //↑と思ったけど、cardsShortUrlが正のデータなわけだから 67 sheet.getRange(2,7,cardsshortURL.length).setValues(cardsshortURL); 68 //で十分 69 //登場した順で、間に挿入する場合] 70 71/* if(added.length > 0){ 72 var count_ = 1 73 for(var k =0;k<cardsshortURL.length;i++){ 74 if(sheetshortURL[k+count] != cardsshortURL[k]){ 75 count_ = count_ + 1; 76 Logger.log(k); 77 sheetsheet.insertRowAfter(count_ + 1); 78 break; 79 } 80 } 81 }*/ 82 Logger.log(added) 83 //sheetsheet.getRange(1, 13, 48, 3).setValues(cards) 84}

投稿2019/03/25 02:00

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問