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

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

ただいまの
回答率

87.59%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,019

score 37

前提・実現したいこと

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

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

特になし

該当のソースコード

function createCards(){

  //-----追加するカードの内容をtrelloから取得する

   const trelloKey   = "XXXXXXXXX";//keyを入力してください
    const trelloToken = "XXXXXXXXX";//tokenを入力してください
    const userName = "kodanosuke";//user nameを入力してください
    const boardID = 'XXXXXXXXXXXXX'

   /* //テンプレートのリストIDと名前の一覧
    var list = [listID1,listID2,listID3,listID4,listID5,]
    var prelist_name = [listNAME1,listNAME2,listNAME3,listNAME4,listNAME5,]
    var listNum = list.length;*/

   //---torelloのカード一覧を取得し、必要な情報だけ抜き出す
    var cardsshortURL = [];
    var count = 0

    for(var j = 0;j < listNum;j++){
      var url = "https://trello.com/1/lists/" + list[j] + "/cards?key=" + trelloKey + "&token=" + trelloToken;
      var res = UrlFetchApp.fetch(url, {'method':'get'});
      var card = JSON.parse(res.getContentText());
      var cardNum = card.length   
      var list_name = prelist_name[j]



      //必要なデータのKeyを指定して値を取得する
      for(var i = 0;i < cardNum;i++){

        var name = card[i]['name']
        var shortURL = card[i]['shortUrl']

        //取得したここのデータをまとめて、ひとつのカード情報としてまとめる
        count = count + 1
        //Logger.log(count)
        var card1 = [shortURL];     

        cardsshortURL.push(card1)
        //Logger.log(cards)

      }    
    }
    var cardsNum = cardsshortURL.length 
    //Logger.log(cards)


    //---既存カード情報をスプレッドシートから取得する
  var sheetsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('memo')
  var order = sheetsheet.getRange(2, 1, sheetsheet.getLastRow()-1).getValues()//カードの順番
  var stats = sheetsheet.getRange(2, 2, sheetsheet.getLastRow()-1).getValues()//カードの作成状況
  var listname = sheetsheet.getRange(2, 3, sheetsheet.getLastRow()-1).getValues()//リスト名
  var sheetshortURL = sheetsheet.getRange(2, 7, sheetsheet.getLastRow()-1).getValues()//shorturl

  const ar1 = cardsshortURL;
const ar2 = sheetshortURL;

var res = ar1.filter(function(e){return ar2.filter(function(f){return e.toString() == f.toString()}).length == 0});
  if(res.length > 0){
 var count = 1
   for(var i=0;i<cardsshortURL.length;i++){

    if(sheetshortURL[i+count] != cardsshortURL[i]){
              count = count+1
        Logger.log(i)
        sheetsheet.insertRowAfter(count + 1)
          break
    }

 } 
 }
  Logger.log(res)
  //sheetsheet.getRange(1, 13, 48, 3).setValues(cards)


      }  

試したこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

  • trelloやってないので、検証してない
  • trelloからは正しくとれている前提
  • 要件的に「追加した順番通りにスプレッドシートの方に転記したい」の意味が曖昧だったので2パターン書いた(似たようなことを2ブロックでやっているのでちゃんと見ないと使いものにならない)
  • 「cardsshortURLとsheetshortURLが一致するかfor文内で確認し、一致しない場合はその場所で行を1行入れたいです」について
    insertRowAfterしても空の行が入るだけで意味がない。また、cardsshortとsheetshortが連動していて、例えば「1,11,2,3」と「1,2,3」とあるときに、「11」を2番目に入れたい、という意図だと考えると、比較なんかせずとも、cardsshortを上書きするだけで済む話。
  • 全般的にコードからやりたいこと(仕様)が見えてこない。状態をもちすぎてて読解できない。これはもう業務委託するレベル。これ以上teratailで回答を得るのは無理
function createCards(){

    //-----追加するカードの内容をtrelloから取得する
    const trelloKey   = "XXXXXXXXX";//keyを入力してください
    const trelloToken = "XXXXXXXXX";//tokenを入力してください
    const userName = "kodanosuke";//user nameを入力してください
    const boardID = 'XXXXXXXXXXXXX';

   /* //テンプレートのリストIDと名前の一覧
    var list = [listID1,listID2,listID3,listID4,listID5,]
    var prelist_name = [listNAME1,listNAME2,listNAME3,listNAME4,listNAME5,]
    var listNum = list.length;*/

   //---torelloのカード一覧を取得し、必要な情報だけ抜き出す
    var cardsshortURL = [];
    var count = 0;

    for(var j = 0;j < listNum;j++){
      var url = "https://trello.com/1/lists/" + list[j] + "/cards?key=" + trelloKey + "&token=" + trelloToken;
      var res = UrlFetchApp.fetch(url, {'method':'get'});
      var card = JSON.parse(res.getContentText());
      var cardNum = card.length;
      var list_name = prelist_name[j];

      //必要なデータのKeyを指定して値を取得する
      for(var i = 0;i < cardNum;i++){
        var name = card[i]['name'];
        var shortURL = card[i]['shortUrl'];
        //取得したここのデータをまとめて、ひとつのカード情報としてまとめる
        count = count + 1;
        //Logger.log(count)
        //var card1 = [shortURL];     
        cardsshortURL.push([shortURL]);
        //Logger.log(cards)
      }    
    }
    var cardsNum = cardsshortURL.length;
    //Logger.log(cards)


    //---既存カード情報をスプレッドシートから取得する
    var sheetsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('memo');
    var order = sheetsheet.getRange(2, 1, sheetsheet.getLastRow()-1).getValues();//カードの順番
    var stats = sheetsheet.getRange(2, 2, sheetsheet.getLastRow()-1).getValues();//カードの作成状況
    var listname = sheetsheet.getRange(2, 3, sheetsheet.getLastRow()-1).getValues();//リスト名
    var sheetshortURL = sheetsheet.getRange(2, 7, sheetsheet.getLastRow()-1).getValues();//shorturl

    const ar1 = cardsshortURL;
    const ar2 = sheetshortURL;

    //末尾に、登場した順で、追加する場合
    var added = ar1.filter(function(e){return ar2.filter(function(f){return e[0].toString() === f[0].toString()}).length === 0});
    added.forEach(function(e) {
        sheetshortURL.push(e);
    });
    sheetsheet.getRange(2, 7, added.length).setValues(added);
    //末尾に、登場した順で、追加する場合

    //登場した順で、間に挿入する場合]
    // for(var idx = 0,pos = 0; idx < cardsshortURL.length; idx++,pos++) {
    //     if(cardsshortURL[idx][0] === sheetsshortURL[pos][0]) {continue;}
    //     sheetsheet.insertRowAfter(pos + 1, 1);
    //     sheet.getRange(2,pos + 2).setValue(cardsshortURL[idx][0]);
    //     pos++;
    // }
    //↑と思ったけど、cardsShortUrlが正のデータなわけだから
    sheet.getRange(2,7,cardsshortURL.length).setValues(cardsshortURL);
    //で十分
    //登場した順で、間に挿入する場合]

/*    if(added.length > 0){
        var count_ = 1
        for(var k =0;k<cardsshortURL.length;i++){
            if(sheetshortURL[k+count] != cardsshortURL[k]){
                count_ = count_ + 1;
                Logger.log(k);
                sheetsheet.insertRowAfter(count_ + 1);
                break;
            }
        }
    }*/
    Logger.log(added)
    //sheetsheet.getRange(1, 13, 48, 3).setValues(cards)
}  

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る